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

7
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我需要一种方法将浮点数四舍五入到指定的小数位数,但我希望总是向下取整。

例如,不要这样:

>>> round(2.667, 2)
2.67

我宁愿拥有

>>> round_down(2.667, 2)
2.66

2
这个可能有效:int(2.667 * 100) / 100 - HamZa
1
对于 round_down(-2.667, 2),你希望得到什么结果?(即,对于负数,"down" 应该表示什么意思?) - Mark Dickinson
4个回答

8

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在评论中提到的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
@interjay 哦,是的,在负数的情况下。我会添加的。 - Bhargav Rao

7

以下内容适用于您想要处理的任何位数:

>>> 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,以避免导入。 - R Nar
4
“int”的舍入行为并非总是向下取整,而是朝0方向舍入。使用“int”时,“round_down(-2.667, 2)”将得到“-2.66”,而使用“math.floor”则得到“-2.67”。 - Blair
2
我猜这取决于 OP 所指的“向下取整”的含义,但我会假设在大小上进行向下取整是预期的功能。 - R Nar

2

你可以使用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

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

在代码中增加更多的检查,例如精度不为负等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接