c# vs python float舍入差异

gle*_*xey 0 c# python floating-point rounding

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

Python (2.7)

>>> round(6.25, 1)
6.3
>>> "%.1f"%6.25
6.2
Run Code Online (Sandbox Code Playgroud)

C#

>>> Math.Round(6.25,1)
6.2
>>> (6.25).ToString("F1")
6.3
Run Code Online (Sandbox Code Playgroud)

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

Wai*_*Lee 5

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

蟒蛇的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.3距离0比更远6.2
  • C# 四舍五入到最接近的偶数,因此6.25变为,6.2因为6.2是最接近的偶数。

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

Math.Round(6.25, 1,  MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

这将执行与 Python 舍入相同的操作。