注意:这个问题是关于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/