C# 使用ToString()格式化时十进制和双精度之间的舍入差异

C# 使用ToString()格式化时十进制和双精度之间的舍入差异,c#,.net-core,C#,.net Core,使用ToString(“F2”)格式化数值时,我发现结果有所不同 为什么这些值的舍入方式不同 .NET FIDLE版本的代码。有文档记录: 当精度说明符控制结果字符串中的小数位数时,结果字符串将反映一个四舍五入为最接近无限精确结果的可表示结果的数字。如果有两个同样接近可代表性的结果: 在.NET Framework和.NET Core(直到.NET Core 2.0)上,运行时选择具有较大最低有效位的结果(即,使用中点舍入.AwayFromZero) 在.NETCore2.1及更高版本上,运行

使用
ToString(“F2”)
格式化数值时,我发现结果有所不同

为什么这些值的舍入方式不同

.NET FIDLE版本的代码。

有文档记录:

当精度说明符控制结果字符串中的小数位数时,结果字符串将反映一个四舍五入为最接近无限精确结果的可表示结果的数字。如果有两个同样接近可代表性的结果:

  • 在.NET Framework和.NET Core(直到.NET Core 2.0)上,运行时选择具有较大最低有效位的结果(即,使用
    中点舍入.AwayFromZero
  • 在.NETCore2.1及更高版本上,运行时选择具有最低有效位的结果(即使用)

请注意,
double
是一种浮点二进制点类型。它们以二进制表示(如11010.00110)。当double以十进制表示时,它只是一种近似值,因为并非所有二进制数都以十进制表示。

在.NET Framework的两种情况下都打印
0.13
。@UweKeim for 4.7.2不适用于OK,当使用.NET Core 3.1时,具有相同的行为(
0.13
0.12
).似乎框架使用的是从零到中的中点,而核心不是。。。因为我认为这个故事的寓意是:总是做你自己的事情,以确定会发生什么。
0.125m.ToString("F2", CultureInfo.InvariantCulture); // 0.13
0.125.ToString("F2", CultureInfo.InvariantCulture); // 0.12