如何在C#中对浮点数进行舍入?

9

我有一个浮点值需要四舍五入。

我有一个浮点值设置为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,而且我不知道为什么上述任何方法都不起作用。


5
你在意一个 0.00000000000000004 的差异吗?无论如何,阅读这个:http://floating-point-gui.de/ - Blorgbeard
3个回答

23

由于0.8在二进制浮点数中无法表示,因此无法准确表达为一个二进制浮点数值。关于这个主题的所需阅读资料可以参考《计算机科学家应该知道的浮点运算知识》

你可以使用 decimal 代替二进制浮点数进行表示,它使用十进制浮点表示法并且可以准确地表示0.8。或者你也可以选择继续使用二进制浮点数,但只显示小数点后有限位数的数字。

要将这个值取到一个 decimal 变量中,并将其精确到小数点后两位,你可以编写:

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

谢谢你的解释,我会去了解一下浮点运算。这对我很有帮助 :) - Diemauerdk

3

这是因为不存在一个精确等于0.8的float类型。你可以使用decimal类型代替,它是一种十进制浮点数类型而不是二进制浮点数类型,或者在显示数字时适当地格式化。


2
通常,在计算浮点数的时候,您不需要四舍五入浮点数值:

0.80000000000000004非常接近0.8。

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

您想要将值四舍五入的地方是最终输出; 在这种情况下,您可以使用格式化

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

3
它不仅非常接近,而且它是最接近 IEEE 754 双精度格式的 8./10 的数(好吧,最接近的数字确切地是0.8000000000000000444089209850062616169452667236328125,但是这两个数字都将舍入为相同的双精度浮点数)。 - aka.nice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接