首页 > 解决方案 > c# vs python float 舍入差异

问题描述

我正在用python开发一个应用程序,其中一些部分是用c#编写的(为了加快速度),我很困惑为什么在使用“round”函数和字符串浮点格式化函数时,c#浮点舍入的行为与python“相反”,这是一个例子:

蟒蛇 (2.7)

>>> round(6.25, 1)
6.3
>>> "%.1f"%6.25
6.2

C#

>>> Math.Round(6.25,1)
6.2
>>> (6.25).ToString("F1")
6.3

有人理解为什么 Python 与 c# 之间的行为似乎“相反”吗?有没有办法将“双”浮点值四舍五入为 N 个十进制数字,以在 Python 和 C# 之间产生有保证的相同字符串输出?

标签: c#pythonfloating-pointrounding

解决方案


这是由于您调用的两种方法的中点分辨率。

蟒蛇的round(number[, ndigits])

ndigits返回四舍五入到小数点后数字的浮点值数字。如果ndigits省略,则默认为零。结果是一个浮点数。值四舍五入到最接近的 10 的负数倍数ndigits;如果两个倍数同样接近,则舍入远离0(例如,round(0.5)is1.0round(-0.5)is -1.0)。

CSMath.Round(double, int)

将双精度浮点值四舍五入为指定的小数位数,并将中点值四舍五入为最接近的偶数。

换句话说:

  • Python 从零四舍五入(6.25因为6.3距离6.30更远6.2
  • C# 四舍五入到最近的偶数,所以6.25变成了6.2因为6.2是最近的偶数。

Math.Round您可以通过使用采用MidpointRounding枚举值的重载之一来解决此问题,例如Round(double, int, MidpointRounding) ,例如:

Math.Round(6.25, 1,  MidpointRounding.AwayFromZero);

这将与 Python 舍入做同样的事情。


推荐阅读