我需要一种方法将浮点数舍入到给定的小数位数,但我想总是向下舍入。
例如,而不是
>>> round(2.667, 2)
2.67
我宁愿拥有
>>> round_down(2.667, 2)
2.66
答案 0 :(得分:5)
您在[{3}}和quantize
>>> 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_FLOOR
用于正数。由于interjay提及ROUND_DOWN
,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 :(得分:3)
这样的事情应该适用于您想要做的任何数字:
>>> 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 :(得分:2)
您可以使用math.floor
来"向下舍入"四舍五入。因此,要舍入到小数点后第3位,您可以尝试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
答案 3 :(得分:1)
你也可以使用字符串来玩这个
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
使用更多检查来修补代码,例如精确度不是负面的。