首页 新闻 会员 周边

麻烦给出 四舍五入及取有效数字的实现

0
悬赏园豆:100 [已关闭问题]

最好不适用库函数

问题补充: 有效数字并不是取有效数字的个数。是精确到几位有效数字
Paradox的主页 Paradox | 初学一级 | 园豆:105
提问于:2010-06-10 23:02
< >
分享
其他回答(1)
0

    C#,java,vbscript 都是采用的四舍六入五成双(下有解释)。

    SQL server 使用的是四舍五入。

    C#如 Math.Round(1.25,1) = 1.2。

    SQL 中 select round(1.25,1) 返回的是1.3。


    C# 中实现四舍五入的参考代码:

    如 2.45要四舍五入到小数后一位,可以先给 2.45*10,然后加0.5,再取整,再除以10就OK了

      public double C1Round(double value, int digit)
      {
        double vt = Math.Pow(10, digit);
        double vx = value * vt;
       
        vx +=0.5;
        return (Math.Floor(vx) / vt);
      }   

四舍六入五成双

四舍六入五成双是一种精确度的计数保留法.舍入规律是"四舍六入五成双",这里"四"是小于五的意思,"六"是大于五的意思,"五"是舍入位之后的尾数逢五的话看前一位,奇进偶不进,就像1.25,因为2是偶数,所以是1.2。又像1.35,因为3是奇数,所以是1.4,明不明白,这个是数据统计需要的.

        从统计学的角度,"四舍六入五成双"比"四舍五入"要科学,它使舍入后的结果有的变大,有的变小,更平均.而不是像四舍五入那样逢五就入,导致结果偏向大数.
例如:1.15+1.25+1.35+1.45=5.2,若按四舍五入取一位小数计算
1.2+1.3+1.4+1.5=5.4
按" 四舍六入五成双"计算,1.2+1.2+1.4+1.4=5.2,舍入后的结果更能反映实际结果

 

一、  (int)(0.5+0.5)就是1,所以,对于从十分位四舍五入到个位只要在强行转换到int之前先加0.5,其他的位类似!
二、通过 Round方法

using System.Math;
......

Round(3.045,2)// 返回值:3.05
Round(3.044,2)//返回值:3.04

邀月 | 园豆:25475 (高人七级) | 2010-06-11 08:26
0
/// <summary>
/// 获取整数位数
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static int GetIntCount(double value)
{
long v = ((long)value);
v
= Math.Abs(v);

int count = 0;

while (v > 0)
{
count
++;
v
/= 10;
}

return count;
}

/// <summary>
/// 得小数位数
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static int GetDecimal(double value)
{
string vStr = value.ToString();

int dotPosition = vStr.IndexOf('.');

if (dotPosition < 0)
{
return 0;
}
else
{
return vStr.Length - dotPosition -1;
}
}

/// <summary>
/// 四舍五入
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static double Round(double value)
{
int dec = GetDecimal(value); //获取小数位数
if (dec > 0)
{
dec
--;
}

return Math.Round(value, dec, MidpointRounding.AwayFromZero);
}

 

/// <summary>
/// 获取有效数字
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static int GetSignificantFigures(double value)
{
return GetIntCount(value) + GetDecimal(value);
}

 

eaglet | 园豆:17139 (专家六级) | 2010-06-11 08:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册