使用ToString()格式化时,十进制和双精度浮点数的舍入差异

4
我发现使用 ToString("F2") 格式化数字值时,结果存在差异。
0.125m.ToString("F2", CultureInfo.InvariantCulture); // 0.13
0.125.ToString("F2", CultureInfo.InvariantCulture); // 0.12

这些值为什么被舍入得不一样?
这里是代码的.NET Fiddle版本here

3
@UweKeim 是针对4.7.2版本而不是Core 3.1的。 - Selvin
好的,当使用.NET Core 3.1时,.NET Fiddle具有相同的行为(0.130.12)。 - Uwe Keim
2
似乎框架正在使用MidpointAwayFromZero,而核心不是...因为它与0,135一起很好。 - Selvin
5
我认为寓意是:始终进行自己的四舍五入,以确保发生的情况。 - Peter B
@TimSchmelter - 看起来没错 - 0.135 并且都四舍五入为 0.14。啊,计算机和数字... :( - Sean Kearon
显示剩余9条评论
1个回答

4

这里有详细的文档(链接)

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

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

请注意,double是浮点二进制点类型。它们以二进制系统表示(如11010.00110)。当以十进制系统呈现double时,它只是一种近似值,因为不是所有二进制数都在十进制系统中具有精确表示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接