使用ToString()进行格式化时,舍入小数和双精度之间的差值



使用ToString("F2")格式化数值时,我发现结果存在差异。

0.125m.ToString("F2", CultureInfo.InvariantCulture); // 0.13
0.125.ToString("F2", CultureInfo.InvariantCulture); // 0.12

为什么这些值四舍五入不同?

.NET Fiddle版本的代码。

这里有文档:

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

  • 在.NET Framework和.NET Core 2.0之前的.NET Core上,运行时会选择最低有效位数较大的结果(即使用MidpointRounding.AwayFromZero(
  • 在.NET Core 2.1及更高版本上,运行时选择具有偶数最低有效数字的结果(即使用MidpointRounding.ToEven(

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

最新更新