c#中的打印增量为0.1

bur*_*1ce 7 c# floating-point

我目前正在阅读Steve McConnell撰写的Code Complete,特别是关于浮点数的第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");
        }
Run Code Online (Sandbox Code Playgroud)

我得到的印刷品为 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0数字不同

为什么我没有得到假设发生的输出?即: 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.79999999999999999 0.89999999999999999 0.99999999999999999数字不同

当我从double到string进行隐式转换时,C#是否会舍入数字?我想是这样的,因为当我调试应用程序并逐步执行for循环时,我可以看到非终止重复的十进制数.你怎么看?我是对还是错?

Kel*_*tex 13

double.ToString()使用一般格式,如果未指定precision,则默认为15位小数.所以它确实做了一点舍入,这就是为什么你看到你所看到的.例如,您在问题中指定的0.89999999999999999是小数点后17位.你实际上可以看到整个数字sum.ToString("g17").

你可以在这里找到.net的标准数字格式字符串及其默认精度:http: //msdn.microsoft.com/en-us/library/dwhawy9k(VS.80).aspx