c# - 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# 之间产生有保证的相同字符串输出?
解决方案
这是由于您调用的两种方法的中点分辨率。
ndigits
返回四舍五入到小数点后数字的浮点值数字。如果ndigits
省略,则默认为零。结果是一个浮点数。值四舍五入到最接近的 10 的负数倍数ndigits
;如果两个倍数同样接近,则舍入远离0
(例如,round(0.5)
is1.0
和round(-0.5)
is-1.0
)。
将双精度浮点值四舍五入为指定的小数位数,并将中点值四舍五入为最接近的偶数。
换句话说:
- 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);
这将与 Python 舍入做同样的事情。
推荐阅读
- android - 缩放动画不会改变 ImageView 的大小
- typescript - 如何使脚本在量角器中执行下一个它之前等待给定的时间跨度
- python - 根据两个条件预测某人离开的概率
- android - TabLayout 文本重力启动
- java - 我想根据从我的 firebase 数据库中获得的值打开一个特定的活动
- python - pyspark 数据帧的数据类型与 Presto 数据类型的详尽映射是什么?
- python - 如何获取要在请求中设置的 cookie 值?
- jenkins - 如果有两个 jenkins freestyleproject 具有相同的 scm git url,我如何仅触发特定的 freestyleproject?
- python - 检查两行并插入新行,如果它们在增加 starttime 后不匹配
- sql - 创建一个包含数组列 ms sql 的表