【发布时间】:2013-08-06 23:05:47
【问题描述】:
我有这个测试代码:
class Test
{
static void Main()
{
decimal m = 1M / 6M;
double d = 1.0 / 6.0;
decimal notQuiteWholeM = m + m + m + m + m + m; // 1.0000000000000000000000000002M
double notQuiteWholeD = d + d + d + d + d + d; // 0.99999999999999989
Console.WriteLine(notQuiteWholeM); // Prints: 1.0000000000000000000000000002
Console.WriteLine(notQuiteWholeD); // Prints: 1.
Console.WriteLine(notQuiteWholeM == 1M); // False
Console.WriteLine(notQuiteWholeD < 1.0); // Prints: True. Why?
Console.ReadKey();
}
}
为什么这行打印 1?
Console.WriteLine(notQuiteWholeD); // Prints: 1
一个这个,为什么打印True?
是否有自动舍入过程?如何打印正确/计算的值?
[注意:我在 C# 5.0 in a Nutsheel 第 30 页:实数舍入错误] 中找到了此示例代码。
提前致谢。
【问题讨论】:
-
请记住,即使是“大小数”也是任意精度,而不是无限精度。在某些情况下,使用任何有限表示都会导致舍入,最好您可以控制这种情况发生的时间,而不是浮点数/双精度数 - 或 .NET 小数。