我目前正在阅读由Steve McConnell完成的代码,特别是关于浮点数的第295页.
当我运行以下代码时:
double nominal = 1.0;
double sum = 0.0;
for (int i = 0; i < 10; i++)
{
sum += 0.1;
Console.WriteLine("sum: " + sum.ToString());
}
if (equals(nominal,sum))
{
Console.WriteLine("Numbers are the same");
}
else
{
Console.WriteLine("Numbers are different");
}我得到了一个打印出的0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0数字是不同的
为什么我没有得到应该发生的输出呢?ie: 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.79999999999999999 0.89999999999999999 0.99999999999999999数字不同
C#舍入数字时,我进行隐式转换从双字符串?我认为是这样的,因为当我调试应用程序并逐步遍历for循环时,我可以看到不终止的重复十进制数。你认为如何?我是对还是错?
发布于 2009-05-19 19:22:36
double.ToString()使用一般格式,如果没有指定精度,该格式默认为小数点15位。所以它确实有一点四舍五入,这就是为什么你看到了你所看到的。例如,您在问题中指定的0.89999999999999999位是小数点17位。通过执行sum.ToString("g17"),您实际上可以看到整个数字。
您可以在这里找到.NET的标准数字格式字符串及其默认精度:http://msdn.microsoft.com/en-us/library/dwhawy9k(VS.80).aspx
发布于 2009-05-19 19:27:26
这是在ToString的默认行为。如果您查看调试器中的sum,就会得到以下结果,它显示了不通过ToString路由的值:
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.79999999999999993
0.89999999999999991表示基本行为正如您所预期的那样。
hth
发布于 2009-05-19 19:44:29
简单的回答是:它是浮点,所以不要指望它是正确的(合适的“右”值)!长期的答案是理解浮点是如何工作的,人们是如何使用浮点的。IIRC GNU printf (和其他我会假设的)特例“非常接近一个很好的基数10”。
https://stackoverflow.com/questions/884538
复制相似问题