当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么python十进制库不为某些输入返回指定数量的有效数字》经验,为你挑选了1个好方法。

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

编辑:此问题不是十进制模块中有效数字的重复。这两个问题是关于完全不同的问题。我想知道为什么函数不返回特定输入的期望值。十进制模块中有效数字的答案均未解决该问题。


假定以下函数返回具有指定数量的有效数字的浮点数的字符串表示形式:

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



1> user2357112 ..:

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

调用时to_sigfigs(0.000001, 5)0.000001由于从源代码到二进制浮点的转换,已经存在一些舍入错误。实际上是9.99999999999999954748111825886258685613938723690807819366455078125E-7。四舍五入到5位有效数字给出decimal.Decimal("0.0000010000")

另一方面,二进制浮点数中的1可以精确表示,因此1 1.0也正好。由于只需要1位数字来表示十进制,上下文的精度就不需要四舍五入,并且得到1位数字的十进制结果。

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有