我有这两个值需要四舍五入到两个小数空格
n = 59.9250
n1 = 459.4250
print(round(n, 2))
print(round(n1, 2))
输出
59.92
459.43
有人能解释一下原因吗?有没有一种方法可以像我使用3.6.8版的python时一样将这两种情况进行循环
我有这两个值需要四舍五入到两个小数空格
n = 59.9250
n1 = 459.4250
print(round(n, 2))
print(round(n1, 2))
输出
59.92
459.43
有人能解释一下原因吗?有没有一种方法可以像我使用3.6.8版的python时一样将这两种情况进行循环
对于内置的浮点对象,Python使用IEEE-754双精度数字,这意味着绝大多数数字不能准确表示.您可以通过创建一个恰好在限制之下和之上的变量来进行实验测试:
>>> n3 = 1e308 ; n3
1e+308
>>> n3 = 1e309 ; n3
inf
但是,由于CPython是开源的,您也可以通过查看处理浮点对象的代码来验证这一点.在CPython中,它可以在Objects/floatobject.c
中找到,您将看到代码中夹杂着用来保存值的Cdouble
变量.
因此,如果您在转换站点(如this binary converter)中键入这两个数字,您将看到它们转换为最接近的匹配项,如下所示:
|
59.925 59.92499999.....something
459.925 459.42500000..1..something
|
您可以在这里看到,遵循"下一位数为0..4
,向上舍入为5..9
"的规则,第一位数将取整down到59.92
,因为下一位数是4
(请记住,这里没有特殊的"半途而废"行为,因为两者都不是半途而废).
出于同样的原因,第二个数字将舍入up到459.93
,因为它的下一个数字是5
.
这Python documentation for round
人实际上提出了这样一种可能性:
注意:对于浮点数,
round()
的行为可能令人惊讶:例如,round(2.675, 2)
等于2.67
,而不是预期的2.68
.这不是错误:这是因为大多数小数不能精确地表示为浮点数.有关详细信息,请参阅Floating Point Arithmetic: Issues and Limitations.
如果您really想要避免这个问题,您应该跳过使用内置浮点对象及其所有缺点,而 Select 使用Decimal
类.
然后,您可以使用它以多种方式处理数字,同时避免损失精度.例如,以下文字记录:
ROUND_HALF_UP
指定符向上舍入到无限大)取整,而不是使用银行家的舍入;然后>>> d = decimal.Decimal("59.925")
>>> decimal.getcontext().rounding = decimal.ROUND_HALF_UP
>>> round(d, 2)
Decimal('59.93')