2016-06-08 56 views
4

我需要一種方法來將浮點數四捨五入到給定的小數位數,但我總是舍入。如何將float向下舍入到給定的精度?

例如,而不是

>>> round(2.667, 2) 
2.67 

我寧願有

>>> round_down(2.667, 2) 
2.66 
+2

這可能工作'int(2.667 * 100)/ 100' – HamZa

+0

你想爲'round_down(-2.667,2)'得到什麼結果? (即,什麼應該「下」意味着負數?) –

回答

2

像這樣的東西應該工作,無論位數你想做的事:

>>> import math 
>>> def round_down(num,digits): 
     factor = 10.0 ** digits 
     return math.floor(num * factor)/factor 

>>> round_down(2.667,2) 
2.66 
+2

只是使用'int'而不是'math.floor'來避免導入 –

+4

雖然'int'並不總是舍入,它反而會向0逼近。 int','round_down(-2.667,2)'會給出'-2.66',而'math.floor'則給出'-2.67'和 – Brien

+1

我想這取決於OP的意思,但我會假設預計的功能將會減小幅度 –

1

您可以使用math.floor爲 「四捨五入」 到最接近的整數。因此,要舍入到小數點後第三位,您可以嘗試math.floor(1000*number)/1000

在一般情況下,「四捨五入」了許多num精密n,你可以嘗試:

from math import floor 

def round_down(num, n): 
    multiplier = pow(10,n) 
    return floor(num * multiplier)/multiplier 
5

你有一個朋友在quantizeROUND_FLOOR

>>> from decimal import Decimal,ROUND_FLOOR 
>>> float(Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_FLOOR)) 
2.66 
>>> float(Decimal(str(-2.667)).quantize(Decimal('.01'), rounding=ROUND_FLOOR)) 
-2.67 

請注意,您可以使用ROUND_DOWN作爲正數。由於interjay提到in a comment,ROUND_DOWN回合到零,因此可能會返回不正確的值的負數。

>>> from decimal import Decimal,ROUND_DOWN 
>>> Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_DOWN) 
Decimal('2.66') 
>>> float(Decimal(str(2.667)).quantize(Decimal('.01'), rounding=ROUND_DOWN)) 
2.66 
+1

請注意,ROUND_DOWN朝向零變爲零,這是非常令人誤解的命名。 'ROUND_FLOOR'將向無窮大轉變。 – interjay

+0

@interjay啊是的,在負數的情況下。我會補充一點。 –

0

你也可以玩這個使用字符串

def round_down(num, prec): 
    if isinstance(num, float): 
     s = str(num) 
     return float(s[:s.find('.') + prec + 1]) 
    else: 
     raise ValueError 

round_down(2.6667, 2) 
# 2.66 

補丁代碼與更多的檢查一樣精確度不等等負面。