Python 2.7第1轮十进制不正确

时间:2014-10-08 08:33:43

标签: python-2.7 rounding

1位小数舍入不正确:

见下文:

round(11.35, 1)
11.3

round(1.35, 1)
1.4

如何在Python中解决这个问题?

这个问题的解决方案是:

def round_decimal(value, rounding):
    number = decimal.Decimal(str(value))
    decimal_point = float("1e%d" % -rounding)
    return float(number.quantize(decimal.Decimal(str(decimal_point))))

3 个答案:

答案 0 :(得分:4)

这是一般计算机中小数位表示的问题(非Python特有的)。

我认为解决这个问题的方法是使用标准库模块decimal。在你的情况下,它看起来像这样:

num1 = decimal.Decimal("11.35")
print num1.quantize(decimal.Decimal("0.1")) # round to one decimal
# output: 11.4

num2 = decimal.Decimal("1.35")
print num2.quantize(decimal.Decimal("0.1"))
# output: 1.4

答案 1 :(得分:3)

原因是11.35保持为float,使用二进制浮点表示存储。并且11.35不能完全表示为二进制浮点值。

可表示的二进制浮点值的形式为s×2 e ,其中s和e是整数。请注意,11.35不能以此形式书写。在编写11.35时,Python中发生的是系统使用最接近的可表示值。

closest double precision value to 11.35是:

11.35 = + 11.34999 99999 99999 64472 86321 19949 90706 44378 66210 9375

这解释了round(11.35, 1)行为的原因。

有趣的是,round(11.35, 1)甚至不等于11.3,因为11.3不能用二进制浮点表示。它继续下去。

如果要准确表示11.35,则需要将其存储为十进制数据类型。 decimal标准库是Python中显而易见的方法。这个问题详细介绍了该主题:How can I format a decimal to always show 2 decimal places?

答案 2 :(得分:0)

除了之前的答案,我认为了解舍入规则很有帮助。您假设值11.35应舍入为11.4,但实际上,当您在舍入中达到中点值时,向下舍入是一个选项。请参阅:http://en.wikipedia.org/wiki/Rounding

使用十进制库是解决python问题的最佳方法。