注意:这个问题是关于重要数字的。这不是关于“小数点后的数字”或类似的问题。
编辑:此问题不是十进制模块中有效数字的重复。这两个问题是关于完全不同的问题。我想知道为什么函数不返回特定输入的期望值。十进制模块中有效数字的答案均未解决该问题。
假定以下函数返回具有指定数量的有效数字的浮点数的字符串表示形式:
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,5位有效数字表示1.0)的期望输出是字符串'1.0000'。实际输出为字符串“ 1”。
我是误解了什么还是这是一个错误decimal
?
上下文的精度是最大精度;如果某个操作产生的小数位数少于上下文的精度,则不会填充到上下文的精度。
调用时to_sigfigs(0.000001, 5)
,0.000001
由于从源代码到二进制浮点的转换,已经存在一些舍入错误。实际上是9.99999999999999954748111825886258685613938723690807819366455078125E-7。四舍五入到5位有效数字给出decimal.Decimal("0.0000010000")
。
另一方面,二进制浮点数中的1可以精确表示,因此1 1.0
也正好。由于只需要1位数字来表示十进制,上下文的精度就不需要四舍五入,并且得到1位数字的十进制结果。