我想在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
之前感谢
答案 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