首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在c#中打印0.1的增量

在c#中打印0.1的增量
EN

Stack Overflow用户
提问于 2009-05-19 19:17:21
回答 3查看 4.3K关注 0票数 7

我目前正在阅读由Steve McConnell完成的代码,特别是关于浮点数的第295页.

当我运行以下代码时:

代码语言:javascript
运行
复制
        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循环时,我可以看到不终止的重复十进制数。你认为如何?我是对还是错?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

票数 13
EN

Stack Overflow用户

发布于 2009-05-19 19:27:26

这是在ToString的默认行为。如果您查看调试器中的sum,就会得到以下结果,它显示了不通过ToString路由的值:

代码语言:javascript
运行
复制
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.79999999999999993
0.89999999999999991

表示基本行为正如您所预期的那样。

hth

票数 2
EN

Stack Overflow用户

发布于 2009-05-19 19:44:29

简单的回答是:它是浮点,所以不要指望它是正确的(合适的“右”值)!长期的答案是理解浮点是如何工作的,人们是如何使用浮点的。IIRC GNU printf (和其他我会假设的)特例“非常接近一个很好的基数10”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/884538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档