如何将浮点数舍入到给定的精度?

How to round float down to a given precision?

我需要一种方法将浮点数四舍五入到给定的小数位数,但我希望始终向下舍入。

例如,而不是

>>> round(2.667, 2)
2.67

我宁愿

>>> round_down(2.667, 2)
2.66

您可以使用 math.floor 到 "round down" 最接近的整数。所以要四舍五入到小数点后第三位,你可以试试 math.floor(1000*number) / 1000.

一般来说,要"round down"一个数字num到精度n,你可以试试:

from math import floor

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

像这样的东西应该适用于你想做的任何数字:

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

>>> round_down(2.667,2)
2.66

你在 quantize and 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 for positive numbers. As interjay mentions ROUND_DOWN 向零舍入 ,因此可能 return 不正确的负数值。

>>> 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

您也可以使用字符串来解决这个问题

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

用更多的检查来修补代码,例如精度不为负等。