为什么 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
默认舍入到 最接近的偶数 .
请查看这 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
默认舍入到 最接近的偶数 .