Python舍入不正确的结果

时间:2013-11-28 04:25:24

标签: python python-2.7

我想在python中对数字进行舍入,但它一直给我不准确的结果 例如,我想将99.999999946转换为99.99,或将56.3633333转换为56.36 这就是我尝试过的:

int(99.999999946*100)/100   #result = 99
int(99.999999946*100)/100.0 #result = 99.989999999999995
round(99.999999946, 2)      #result = 100.0

之前感谢

3 个答案:

答案 0 :(得分:2)

在您熟悉二进制浮点的限制之前,您可能会对decimal模块更加满意,该模块实现了一个丰富的十进制浮点模型。除此之外,它还允许精确控制舍入模式:

>>> import decimal
>>> d = decimal.Decimal("99.999999946")
>>> print d
99.999999946
>>> chopped = d.quantize(decimal.Decimal(".01"), decimal.ROUND_DOWN)
>>> print chopped
99.99

泛化

这是一个函数,它会切换到你喜欢的任何数字位置,并返回一个浮点数(通常是不精确的!):

def chop_to_n_decimals(x, n):
    # This "rounds towards 0".  The decimal module
    # offers many other rounding modes - see the docs.
    import decimal
    d = decimal.Decimal(repr(x))
    targetdigit = decimal.Decimal("1e%d" % -n)
    chopped = d.quantize(targetdigit, decimal.ROUND_DOWN)
    return float(chopped)

例如,

for x in 5555.5555, -5555.5555:
    for n in range(-3, 4):
        print x, n, "->", chop_to_n_decimals(x, n)

显示:

5555.5555 -3 -> 5000.0
5555.5555 -2 -> 5500.0
5555.5555 -1 -> 5550.0
5555.5555 0 -> 5555.0
5555.5555 1 -> 5555.5
5555.5555 2 -> 5555.55
5555.5555 3 -> 5555.555
-5555.5555 -3 -> -5000.0
-5555.5555 -2 -> -5500.0
-5555.5555 -1 -> -5550.0
-5555.5555 0 -> -5555.0
-5555.5555 1 -> -5555.5
-5555.5555 2 -> -5555.55
-5555.5555 3 -> -5555.555

答案 1 :(得分:1)

所有结果都是正确的。 int向下舍入,而round向最接近的数字舍入(即数字0-4向下舍入,5-9向上舍入为正数)。在Python 2.x中,带有整数参数的/是整数除法,除非您从division导入__future__,并且整数除法也会向下舍入。

int(99.999999946*100)/100被评估为

int(99.999999946*100)/100
int(9999.9999946) / 100
9999 / 100 # int rounds down
99         # integer division rounds down

int(99.999999946*100)/100.0中的分歧是浮动的。结果可能不是精确到99.98,而是that's to be expected,因为0.98 = 48/50不能用基数2表示。

int(99.999999946*100)/100.0
int(9999.9999946) / 100.
9999 / 100.0        # int rounds down
99.989999999999995  # floating-point division

对于上一个示例,请注意小数点后第二位的数字

round(99.999999946, 2) = 100.0
round(99.989999999999995, 2) = 99.99

如果您想要正确(但相当慢)的十进制计算,请使用decimal模块:

import decimal
d = decimal.Decimal('99.999999946')
d.quantize(decimal.Decimal('.01'), decimal.DOWN)  # Decimal('99.99')

答案 2 :(得分:0)

这允许您舍入到所需的小数位数。

def round_decimal(dec, places=2):
    return int((dec * 10**places) + 0.5) / 10.**places