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

Why is that difference between Math.Round rounding and placeholder rounding in C#?

请查看这 2 个简单的代码以及输出的差异。

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 舍入结果之间存在差异?

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

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

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