【问题标题】:Rounding floating points in python [duplicate]在python中舍入浮点数[重复]
【发布时间】:2019-06-27 12:08:57
【问题描述】:

为什么round(1.45, 1)1.4 但是当我尝试round(2.45, 1) 它给2.5 而不是2.4

【问题讨论】:

标签: python python-3.x


【解决方案1】:

原因是浮点数是如何在内部存储的。根据IEEE 754,浮点数被舍入到下一个有效值。

print("{:.30f}".format(1.45))
print("{:.30f}".format(2.45))
1.449999999999999955591079014994
2.450000000000000177635683940025

为什么将这些值四舍五入为1.42.5 应该是显而易见的。

这里最大的问题是人类的思维方式与计算机的计算方式:人类以 10 为底,计算机以 2 为底。以 2 为底,1.45 是一个无限位数的数字,因此将被四舍五入。

如果你想强制计算机以 10 为基数思考,你可以使用Decimal 库:

from decimal import Decimal                                                      

print("{:.30f}".format(Decimal('1.45')))                                         
print("{:.30f}".format(Decimal('2.45')))                                         
print(round(Decimal('1.45'),1))                                                  
print(round(Decimal('2.45'),1))                                                  
1.450000000000000000000000000000
2.450000000000000000000000000000
1.4
2.4

这可能仍然不是您想要的,因为在数学中我们被教导四舍五入 1.45 将导致 1.5。您可以像这样更改decimal 中的舍入行为:

import decimal                                                                                                                                                 
decimal.getcontext().rounding = decimal.ROUND_HALF_UP                            
1.450000000000000000000000000000
2.450000000000000000000000000000
1.5
2.5

但请记住,计算机以 2 为底的计算速度比以 10 为底的计算快得多。

【讨论】:

  • 实际上,在数学中,如果四舍五入为 0.5,大多数人都会被教导四舍五入到下一个偶数。所以 1.5 和 2.5 都舍入到 2。这是因为 0.5 正好在中间,所以对于总额达到 $xx.xy5 的交易,舍入将取决于 y 的值,给出 ~50/50 / 公平的机会向上或向下取整最后一分钱。
  • 你可以阅读Bankers Rounding以获得更完整的解释
【解决方案2】:

您可以使用decimal 模块,因为它宣称:

decimal 模块支持快速正确舍入的十进制浮点运算。

试试这个:

from decimal import Decimal

n1_45 = Decimal('1.45')
n2_45 = Decimal('2.45')

print(round(n1_45, 1), round(n2_45, 1))

输出:

1.4 2.4

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多