这是我的代码:
using static System.Console;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
double[] doubles = new[] { 9.05, 9.15, 9.25, 9.35, 9.45, 9.55, 9.65, 9.75, 9.85, 9.95 };
foreach (double n in doubles)
{
WriteLine("{0} ===> {1:F1}", n, n);
}
}
}
}
.NET Framework 4.7.2
的输出:
9.05 ===> 9.1
9.15 ===> 9.2
9.25 ===> 9.3
9.35 ===> 9.4
9.45 ===> 9.5
9.55 ===> 9.6
9.65 ===> 9.7
9.75 ===> 9.8
9.85 ===> 9.9
9.95 ===> 10.0
在 .NET 6
中的输出(使用相同的代码):
9.05 ===> 9.1
9.15 ===> 9.2
9.25 ===> 9.2
9.35 ===> 9.3
9.45 ===> 9.4
9.55 ===> 9.6
9.65 ===> 9.7
9.75 ===> 9.8
9.85 ===> 9.8
9.95 ===> 9.9
因此,在 .NET Framework 中,数字的四舍五入方式就像我们在学校里学到的那样。这被称为维基百科中的“round half up
”。
但是在 .NET 6 中,9.05、9.15、9.55、9.65、9.75
会向上舍入,而9.25、9.35、9.45、9.85、9.95
会向下舍入。
我知道有一个规则叫做“round half to even
” - 四舍五入到最近的值;如果数字恰好在中间,则将其舍入为具有偶数最低有效位的最近值。
但这显然不是round half to even
,一些数字被舍入为奇数。
我们如何解释 .NET Framework 4.7.2 和 .NET 6 中的差异,并如何在 .NET 6 中以与 .NET Framework 相同的方式舍入数字?
{1:F1}
这部分,但现在已经很晚了(即睡觉时间),我无法为您调查。 - Andrew Morton{1:F20}
,看看会发生什么。快速浏览@MichaelLiu的链接让我相信这些更改是你所看到结果的原因。记住:float
和double
是不精确的表示。 - Flydog57