numpy 为什么在Python中没有简单的方法将浮点数舍入为有效数字?

kmb7vmvb  于 2023-06-29  发布在  Python
关注(0)|答案(1)|浏览(132)

为什么我们必须编写自己的函数来舍入到sig figs?

round(x, sig-int(floor(log10(abs(x))))-1)

我知道我们可以使用f字符串格式:f"{33.44:.2g}"以字符串形式获取浮点数,智能地舍入为sigfigs以供显示:"33.0"
我试着在标准图书馆里找。有什么特别的原因吗?

编辑

阐明了现有功能:float-> string转换。
有几个原因表明这是有用的:

  • 许多工程计算只需要3-5个符号
  • 你可以直接使用等式运算符x==y而不是np.isclose(x, y, rtol=1e-5)
  • 如果你正在使用print,sympy,pandas,matplotlib或像hand calcs这样的库,每次你都必须打印到屏幕上,你唯一的控制sigfigs的选择是转换为字符串并手动指定f字符串f"{x:.3g}",而不是只写原始浮点数x
  • 是的,很明显,python使用二进制定义的浮点数,而不是十进制数,所以它从来没有真正的“到5个重要的数字技术”👏。但是如果你花2秒使用python,你会认识到默认的行为是在15个小数位后将浮点数剪掉。这就是为什么我们首先要使用round()函数。

默认数字显示在16 dp后忽略:

>>> 1 + 1e-15
1.000000000000001
>>> 1 + 1e-16
1.0

还要注意,相等运算在它们相等超过15个小数位时有效:

>>> 1== (1 + 1e-15)
False
>>> 1== (1 + 1e-16)
True

我只想知道为什么我们没有信号装置。

41ik7eoe

41ik7eoe1#

因为这不是一个有用的行动。
在将浮点值转换为字符串以供输出时,对其进行舍入非常有用。使用您的示例:

x = 33.44
print(f"x is approximately {x:.2g}")

印刷品

x is approximately 33

这是明智之举
但是,将浮点值舍入到小数位数 * 并将结果存储为浮点值 * 是没有用的,一般情况下也是不可能的。
假设我们有一个值33.44,我们想把它四舍五入到小数点后一位,得到33.4。我们可以这样做:

x = 33.44
y = math.floor(x*10) / 10 # or round(y, 1)

但是存储在y中的实际值不是33.4。它可能类似于33.39999999999999857891452847979962825775146484375,因为这是我们在二进制64位浮点中可以得到的最接近的近似值。值33.4无法精确存储。
更好的方法是以系统提供的精度存储和计算浮点值,并在阅读时对结果进行舍入,以转换为人类可读的字符串进行输出。

相关问题