为什么我们必须编写自己的函数来舍入到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
我只想知道为什么我们没有信号装置。
1条答案
按热度按时间41ik7eoe1#
因为这不是一个有用的行动。
在将浮点值转换为字符串以供输出时,对其进行舍入非常有用。使用您的示例:
印刷品
这是明智之举
但是,将浮点值舍入到小数位数 * 并将结果存储为浮点值 * 是没有用的,一般情况下也是不可能的。
假设我们有一个值
33.44
,我们想把它四舍五入到小数点后一位,得到33.4
。我们可以这样做:但是存储在
y
中的实际值不是33.4
。它可能类似于33.39999999999999857891452847979962825775146484375
,因为这是我们在二进制64位浮点中可以得到的最接近的近似值。值33.4
无法精确存储。更好的方法是以系统提供的精度存储和计算浮点值,并在阅读时对结果进行舍入,以转换为人类可读的字符串进行输出。