为什么在C#中Math.Round舍入和占位符舍入之间存在差异?

时间:2016-09-27 21:46:15

标签: c# rounding placeholder difference

请查看这两个简单的代码和输出的差异。

using System;

namespace _02.CircleArea
{
    class CircleArea
    {
        static void Main(string[] args)
        {
            double inputR = double.Parse(Console.ReadLine());
            double circleArea = Math.Round((Math.PI * inputR * inputR), 12);
            Console.WriteLine("{0}", circleArea);
        }
    }
}

输入 123.456 时,输出 47882.2198038791

这样做:

using System;

namespace _02.CircleArea
{
    class CircleArea
    {
        static void Main(string[] args)
        {
            double inputR = double.Parse(Console.ReadLine());
            double circleArea = (Math.PI * inputR * inputR);
            Console.WriteLine("{0:F12}", circleArea);
        }
    }
}

使用相同的输入 123.456 ,它会提供不同的输出 47882.219803879100

为什么占位符舍入和Math.Round舍入结果之间存在差异?

2 个答案:

答案 0 :(得分:2)

两者完全相同。不同之处在于尾随零的显示。由于在第一个代码片段中,有效数字的数量仅用于舍入而不能用于字符串格式化例程,因此您没有得到尾随零也就不足为奇了。

答案 1 :(得分:2)

Math.Round实际上为您提供了一个新的数值,而使用格式代码只需显示一个舍入值。由于您在第二个格式字符串中指定了12位精度而不是第一个格式字符串,因此它会为您提供尾随零。

我会注意到数字格式总是将舍入为零,而Math.Round默认为最接近偶数