如何在Python中向下舍入两个有效数字?

3
我见过很多解决方案,但它们大多数向上舍入到两个有效数字,而不是向下。
我尝试了这几种方法。
import math
v = 0.000129
math.floor(v*100)/100

-output-
0.0    

或者

v = 0.000129
from decimal import Decimal
float(f"{Decimal(f'{v:.2g}'):f}")

-output-
0.00013

如您所见,我希望保留两位有效数字,但不希望进行四舍五入。使用 Decimal 可以得到两位有效数字,但它会进行四舍五入,而使用 math 则只是简单地给出了 0。

例如,这里有几个测试用例。

1999 -> 1900
29901 - > 29000
0.0199 -> 0.019

感谢!

2
这是一个非常奇怪的请求。 "0.020" 和 "0.0199" 表示相同的值。 "0.019" 是完全不同的值。我想不出一种方法来完成这个任务,除非将其转换为字符串并再次转换回来。 - Tim Roberts
我认为你可能需要为此编写自己的四舍五入算法……这并不难,但正如所述,这是一个奇怪的需求,所以我敢打赌它还没有被写出来。例如,您正在请求一个可变数量的“四舍五入”变量/数字位数,因此逻辑似乎是定制的而不是预定义的常规用法,但无论哪种方式,如果您自定义编写它,您可能需要添加一个签名参数到您创建的任何方法中,以允许您在小数位数中向下舍入的位置。 - ViaTech
1个回答

2

不使用任何字符串转换的数学解决方案:

def round_down(n, sig_figs):
    import math
    return n - n % 10 ** math.ceil(math.log(abs(n), 10) - sig_figs)


>>> [round_down(n, 2) for n in [1990, 29901, 0.0199]]
[1900, 29000, 0.019]

注意事项:

  • 不适用于输入为0的情况
  • 负数会按照实际值向负方向四舍五入,而不是朝着零的方向(如-0.0199-0.02

嘿,谢谢你的帮助,目前它可以工作了。但是当我尝试使用round_down(0.00129,2)时,输出结果为0.0012000000000000001。似乎如果小数点后有两个以上的零,它会在最后添加一个数字。你有什么办法可以解决这个问题吗? - EuphoriaLx
浮点数的怪异性是无法避免的。即使是“正常”的计算也可能会产生这种结果(例如,12 * 0.0001 == 0.0012000000000000001)。 - Woodford

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