2

结果必须是 806603.77 但为什么我得到 806603.8 ?

float a = 855000.00f;
float b = 48396.23f;

float res = a - b;
Console.WriteLine(res);
Console.ReadKey();
4

4 回答 4

3

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"));
于 2013-03-15T10:13:26.253 回答
3

您应该改用小数,因为float仅具有7 位精度,这就是结果不同的原因,另一方面具有28-29 位精度。32-bitdecimal128-bit

decimal a = 855000.00M;
decimal b = 48396.23M;

decimal res = a - b;
Console.WriteLine(res);
Console.ReadKey();

输出:806603.77

于 2013-03-15T10:13:34.397 回答
1

因为float精度有限(32 位)。使用doubleordecimal如果你想要更精确。

于 2013-03-15T10:09:52.677 回答
0

请注意,仅仅盲目地使用 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 一样,对吧?

好吧,它没有。

另请注意,十进制计算比双精度计算慢数千倍。它们并不总是适用于非货币计算(例如计算像素偏移或物理事物,如速度,或任何涉及超越数等)。

于 2013-03-15T10:23:57.733 回答