如何在c#中舍入浮点值?

时间:2014-01-07 09:58:26

标签: c# floating-point rounding

我有一个舍入浮点值的问题。 我有一个设置为0.8的浮点值,但在c#代码中它是以某种方式0.80000000000000004。

所以我想围绕它,所以它变成0.8。

我试过了:

float roundedFloatvalue = (float)Math.Round((Decimal)floatvalue, 2, MidpointRounding.AwayFromZero);

float roundedFloatvalue = Truncate(floatvalue, 2);

public static float Truncate(float value, int digits)
{
    double mult = Math.Pow(10.0, digits);
    double result = Math.Truncate(mult * value) / mult;
    return (float)result;
}

似乎我无法获得0.80000000000000004为0.8,我不知道为什么上述任何一项都无效。

3 个答案:

答案 0 :(得分:14)

您不能将0.8精确表示为二进制浮点值,因为0.8在二进制浮点中无法表示。有关此主题的必读内容为What Every Computer Scientist Should Know About Floating-Point Arithmetic

您可以改为使用decimal,它使用十进制浮点表示数字,并且可以精确地表示0.8。或者您可以选择继续使用二进制浮点,但只显示小数点后的有限位数。

要将值转换为decimal变量,四舍五入到小数点后两位,您可以写:

decimal decimalValue = Math.Round((decimal)floatValue, 2);

答案 1 :(得分:3)

这是因为 没有完全 0.8的float的表示。您可以使用decimal代替 decimal 浮点类型而不是二进制浮点类型,或者您可以恰当地格式化数字显示它。

答案 2 :(得分:1)

通常,在计算不需要来舍入浮点值

0.80000000000000004非常接近0.8

(如果0.0 ... 04很重要,为什么要使用 float ,而不是 double ?)

您要对该值进行四舍五入的位置是最终输出;在这种情况下,您可以使用格式

  float x = 0.80000000000000004F;
  Console.Write(x.ToString("G1")); // or "F1"