我需要一種方法來將浮點數四捨五入到給定的小數位數,但我總是舍入。如何將float向下舍入到給定的精度?
例如,而不是
>>> round(2.667, 2)
2.67
我寧願有
>>> round_down(2.667, 2)
2.66
我需要一種方法來將浮點數四捨五入到給定的小數位數,但我總是舍入。如何將float向下舍入到給定的精度?
例如,而不是
>>> round(2.667, 2)
2.67
我寧願有
>>> round_down(2.667, 2)
2.66
像這樣的東西應該工作,無論位數你想做的事:
>>> import math
>>> def round_down(num,digits):
factor = 10.0 ** digits
return math.floor(num * factor)/factor
>>> round_down(2.667,2)
2.66
只是使用'int'而不是'math.floor'來避免導入 –
雖然'int'並不總是舍入,它反而會向0逼近。 int','round_down(-2.667,2)'會給出'-2.66',而'math.floor'則給出'-2.67'和 – Brien
我想這取決於OP的意思,但我會假設預計的功能將會減小幅度 –
您可以使用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
你有一個朋友在quantize
和ROUND_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
請注意,ROUND_DOWN朝向零變爲零,這是非常令人誤解的命名。 'ROUND_FLOOR'將向無窮大轉變。 – interjay
@interjay啊是的,在負數的情況下。我會補充一點。 –
你也可以玩這個使用字符串
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
補丁代碼與更多的檢查一樣精確度不等等負面。
這可能工作'int(2.667 * 100)/ 100' – HamZa
你想爲'round_down(-2.667,2)'得到什麼結果? (即,什麼應該「下」意味着負數?) –