2016-12-07 177 views
2

我可能会错过一些重要的东西,但我无法找到一种方法来'适当地'围绕Python中的浮点数/小数点(2.7),至少保留三位小数。 “适当”我的意思是1.2225应该到1.223,1.2224应该到1.222。'正确'四舍五入到Python,到小数点后三位

我知道round不会为在Python彩车工作,通过设计,但我似乎无法得到Decimal表现不如预期,也不是ceil功能。最好是寻找内置功能而非自定义功能解决方法,但对两者均开放。

>>> x = 1.2225         # expected: 1.223 
>>> round(x, 3)    
1.222           # incorrect 

>>> from math import ceil 

>>> ceil(x * 1000.0)/1000.0 
1.223           # correct 
>>> y = 1.2224         # expected: 1.222 
>>> ceil(y * 1000.0)/1000.0 
1.223           # incorrect 

>>> from decimal import Decimal, ROUND_UP, ROUND_HALF_UP 

>>> x = Decimal(1.2225) 
>>> x.quantize(Decimal('0.001'), ROUND_UP) 
Decimal('1.223')         # correct 
>>> y = Decimal(1.2224) 
>>> y.quantize(Decimal('0.001'), ROUND_UP) 
Decimal('1.223')         # incorrect 

>>> y.quantize(Decimal('0.001'), ROUND_HALF_UP) 
Decimal('1.222')         # correct 
>>> x.quantize(Decimal('0.001'), ROUND_HALF_UP) 
Decimal('1.222')         # incorrect 

有没有办法得到想要的结果?

+0

IDK的为什么你会想到小区** **的1222.4是1222 ... –

+0

@Antti OP只是寻找一种方式做“正确的”四舍五入。这个“ceil”例子只是一种表明“ceil”不能正确完成工作的方式。这并不意味着OP不理解为什么是这样。 – poke

+0

重新打开该问题。 OP表示,他们知道,其设计“圆”不是解决方案。所以[链接的问题](http://stackoverflow.com/questions/18473563/python-incorrect-rounding-with-floating-point-numbers)不是真的有帮助。相反,OP似乎在问如何用小数来正确解决这个问题(以及为什么试图解决方案不起作用)。 – poke

回答

5

的问题是,Decimal(1.2225)是不是你希望它是什么:

>>> Decimal(1.2225) 
Decimal('1.2224999999999999200639422269887290894985198974609375') 

您使用的是浮动到创建小数,但浮动已经是你太不精确用例。正如你所看到的,它实际上是一个1.222499,所以它比1.2225小,因此会正确地将下调为

为了解决这个问题,您需要以正确的精度创建小数点,并将它们作为字符串传递。然后一切按预期工作:

>>> x = Decimal('1.2225') 
>>> x.quantize(Decimal('0.001'), ROUND_HALF_UP) 
Decimal('1.223') 
>>> y = Decimal('1.2224') 
>>> y.quantize(Decimal('0.001'), ROUND_HALF_UP) 
Decimal('1.222') 
+0

啊!我没有看到,但它非常有意义。谢谢! – user2524282

0

这是你在找什么?

float('{:,.3f}'.format(2.2225)) 
+0

用'{:,.3f}'格式(1.2225)'(使用OP的前导输入'1'而不是'2')比较你的格式(2.2225) 。 – poke

+0

是的。在你的答案中解释了处理花车和四舍五入AS的问题。 –

0

这里有三个解决方案在这个链接,我希望这将帮助你正是你想要做的。 https://gist.github.com/jackiekazil/6201722

from decimal import Decimal 

# First we take a float and convert it to a decimal 
x = Decimal(16.0/7) 

# Then we round it to 2 places 
output = round(x,2) 
# Output to screen 
print output 
+0

输出= 2.29,而实际答案是“2.2857142857142856”,所以它的工作。 –

+0

虽然这是正确的,但你有点忽视OP的问题,尽管... – poke