python - 带 2 位小数的舍入方法的错误结果
问题描述
我对带有 2 个小数位的 round() 的结果感到困惑
a = 1352.845
res = round(a, 2)
=> 1352.85 (Right as I expected)
b = 578.005
res = round(b, 2)
=> 578.0 (Wrong, It would be 578.01 instead of 578.0)
案例 b 会发生什么或我误解了什么?
答案:
from decimal import Decimal, ROUND_UP
Decimal('578.005').quantize(Decimal('.01'), rounding=ROUND_UP)
因为它需要用于货币,所以 python round() (银行家的舍入)的默认约定在我的情况下不正确
解决方案
其实并没有错。
这是银行家的四舍五入,是故意的实现细节。
如果您希望保留“始终向上取整 0.5”的方法,您可以这样做:
import decimal
#The rounding you are looking for
decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
>>> Decimal('4')
decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
>>> Decimal('3')
#Other kinds of rounding
decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_EVEN)
>>> Decimal('2')
decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_DOWN)
>>> Decimal('3')
推荐阅读
- php - 如何从对象(集合)中获取价值?
- dataframe - Julia:如何通过索引从数据框中删除多行
- javascript - 如何确定用户何时在输入中键入“@”
- arrays - 如何在Angular 8中选择下拉列表时生成表格
- r - 如何对 R 中具有不同维度的两个数据框求和
- python - 检查特定的 Checkbutton 还会检查 Tkinter 中的另一个复选框
- javascript - Javascript:以编程方式将数字设置为对象键
- c++ - 在创建共享库的过程中发生了什么?
- git - 为什么 BitBucket 无法识别 LFS 跟踪的我的文件?
- sql - 从表中选择数据的别名/变体,并在postgresql中按自己的数据分组