我有一个舍入浮点值的问题。 我有一个设置为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,我不知道为什么上述任何一项都无效。
答案 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"