结果必须是 806603.77 但为什么我得到 806603.8 ?
float a = 855000.00f;
float b = 48396.23f;
float res = a - b;
Console.WriteLine(res);
Console.ReadKey();
结果必须是 806603.77 但为什么我得到 806603.8 ?
float a = 855000.00f;
float b = 48396.23f;
float res = a - b;
Console.WriteLine(res);
Console.ReadKey();
A float
(也称为System.Single
)的精度相当于大约七位小数。您的res
差异需要八位有效的十进制数字。因此,可以预期 a 中没有足够的精度float
。
添加:
一些额外信息:接近 806,000(806,000),afloat
只剩下四位用于小数部分。所以res
它必须在
806603 + 12/16 == 806603.75000000, and
806603 + 13/16 == 806603.81250000
它选择第一个,因为它最接近理想结果。但是这两个值都"806603.8"
在调用时输出ToString()
(Console.WriteLine(float)
确实调用)。ToString
一般调用最多显示 7 位有效小数。要显示两个浮点数是不同的,即使它们使用标准格式打印相同,请使用格式字符串"R"
,例如
Console.WriteLine(res.ToString("R"));
因为float
精度有限(32 位)。使用double
ordecimal
如果你想要更精确。
请注意,仅仅盲目地使用 Decimal 是不够的。
阅读 Oded 发布的链接:每个计算机科学家都应该知道的关于浮点运算的知识
然后才决定使用适当的数字类型。
不要陷入认为只使用 Decimal 就能得到准确结果的陷阱;它不会总是。
考虑以下代码:
Decimal d1 = 1;
Decimal d2 = 101;
Decimal d3 = d1/d2;
Decimal d4 = d3*d2; // d4 = (d1/d2) * d2 = d1
if (d4 == d1)
{
Console.WriteLine("Yay!");
}
else
{
Console.WriteLine("Urk!");
}
如果 Decimal 计算准确,则该代码应打印“Yay!” 因为 d1 应该和 d4 一样,对吧?
好吧,它没有。
另请注意,十进制计算比双精度计算慢数千倍。它们并不总是适用于非货币计算(例如计算像素偏移或物理事物,如速度,或任何涉及超越数等)。