python - 为什么python十进制库不为某些输入返回指定数量的有效数字

标签 python decimal ieee-754 significant-digits

注意:这个问题是关于significant figures的. 不是关于“小数点后的数字”或类似问题的问题。

编辑:这个问题不是 Significant figures in the decimal module 的副本.这两个问题问的是完全不同的问题。我想知道为什么 about 函数没有为特定输入返回所需的值。 Significant figures in the decimal module 没有答案解决这个问题。


以下函数应该返回具有指定有效数字位数的 float 的字符串表示形式:

import decimal

def to_sigfigs(value, sigfigs):
    return str(decimal.Context(prec=sigfigs).create_decimal(value))

乍一看,似乎可行:

print to_sigfigs(0.000003141592653589793, 5)
# 0.0000031416

print to_sigfigs(0.000001, 5)
# 0.0000010000

print to_sigfigs(3.141592653589793, 5)
# 3.1416

...但是

print to_sigfigs(1.0, 5)
# 1

最后一个表达式(IOW,1.0 的 5 位有效数字表示)的期望输出是字符串“1.0000”。实际输出的是字符串'1'。

我是不是误解了什么,或者这是 decimal 中的错误?

最佳答案

上下文的精度是最大精度;如果一个操作会产生一个位数少于上下文精度的 Decimal,则它不会被填充到上下文的精度。

当您调用 to_sigfigs(0.000001, 5) 时,由于从源代码到二进制 float 的转换,0.000001 已经有一些舍入误差。它实际上是 9.99999999999999954748111825886258685613938723690807819366455078125E-7。将其四舍五入为 5 位有效数字得到 decimal.Decimal("0.0000010000")

另一方面,1 可以用二进制 float 表示,所以 1.0 正好是 1。因为用十进制表示只需要一位数,上下文的精度不需要任何四舍五入,你会得到一位小数的结果。

关于python - 为什么python十进制库不为某些输入返回指定数量的有效数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211451/

相关文章:

Python - 带有线程错误的pyqt xcb插件

python - 在 Pandas 中如何根据另一行中的另一列值更新一行中的列值

Python-如何测试用户输入是否是十进制数

c# - 使用 C# 在服务器端文本框中进行十进制验证

c - 使用 CORDIC 的正弦计算结果不精确

python - 在 python 中遍历字典中的项目

python - 加速数据帧循环

舍入数字并强制 R 显示 0

floating-point - 为什么 0.1f 的最后一个二进制位四舍五入为 1?

floating-point - IEEE754 浮点最常见的舍入算法