我想将下面的数字四舍五入到小数点后两位。结果必须为33.39,但Python给出的结果为33.38,因为5舍入为偶数,因此为8。
round(33.385, 2)
答案 0 :(得分:2)
这实际上与舍入至最近/偶数无关。 33.385是十进制数字,但在您的硬件中以二进制浮点形式表示为 approximation 。 decimal
模块可以为您显示该二进制近似值的确切十进制值:
>>> import decimal
>>> decimal.Decimal(33.385)
Decimal('33.38499999999999801048033987171947956085205078125')
这就是为何将其四舍五入为33.38的原因:存储的确切值比33.39略微接近33.38。
如果需要精确的十进制结果,请不要使用硬件的二进制浮点数。例如,您可以在decimal
舍入模式下使用ROUND_HALF_UP
模块。
例如,
>>> from decimal import Decimal as D
>>> x = D("33.385")
>>> x
Decimal('33.385')
>>> twodigits = D("0.01")
>>> x.quantize(twodigits) # nearest/even is the default
Decimal('33.38')
>>> x.quantize(twodigits, rounding=decimal.ROUND_HALF_EVEN) # same thing
Decimal('33.38')
>>> x.quantize(twodigits, rounding=decimal.ROUND_HALF_UP) # what you want
Decimal('33.39')
>>> float(_) # back to binary float
33.39
>>> D(_) # but what the binary 33.39 _really_ is
Decimal('33.3900000000000005684341886080801486968994140625')
答案 1 :(得分:0)
您可以执行以下操作:
import math
math.ceil(33.385 * 100.0) / 100.0
答案 2 :(得分:0)
实际上round()
舍入到您指定的最接近的小数点。编程语言中的浮点数会带来一些麻烦,因为计算机无法使用给定的位来创建足够具体的小数,因此编程语言已经显示了您需要查看的内容,但没有显示实际数字。您可以使用decimal
库查看实数。这样一来,您可以了解为什么有时数字以5结尾或向上或向下舍入。
如果要舍入,则可以使用math
模块轻松完成。
import math
math.floor(33.385 * 100) / 100
如果您想四舍五入,可以使用math.ceil
import math
math.ceil(33.385 * 100) / 100
或者,如果您愿意,仍可以使用round()
函数,但要对其进行一些更改
向上滚动:
decimal_point = 2
change = 0.3 / 10**decimal_point
round(33.385 + change, decimal_point)
向下舍入:
decimal_point = 2
change = 0.3 / 10**decimal_point
round(33.385 - change, decimal_point)
答案 3 :(得分:0)
只是计算机浮点近似的结果。 计算机了解二进制,并且并非所有浮点值都具有准确的二进制表示。 一个著名的例子:
print(0.1 + 0.2 == 0.3)
False
想知道为什么吗?
结果为0.30000000000000004,这是因为二进制文件中的0.2与0.00110011001100...
使用@ Rfroes87的建议将数字转换为整数精度的标度,然后四舍五入为最接近的整数)