如何将浮动向下舍入到给定的精度?

时间:2016-06-08 20:28:55

标签: python rounding

我需要一种方法将浮点数舍入到给定的小数位数,但我想总是向下舍入。

例如,而不是

>>> round(2.667, 2)
2.67

我宁愿拥有

>>> round_down(2.667, 2)
2.66

4 个答案:

答案 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_DOWNROUND_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

使用更多检查来修补代码,例如精确度不是负面的。