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

2024-10-03 15:26:20 发布

您现在位置:Python中文网/ 问答频道 /正文

NB:这个问题是关于significant figures。这不是关于“小数点后的数字”之类的问题。你知道吗

编辑:这个问题不是重复的。这两个问题问的是完全不同的问题。我想知道为什么about函数不返回特定输入的所需值。对Significant figures in the decimal module的回答都没有涉及这个问题。你知道吗


下面的函数应该返回具有指定有效数字数的浮点的字符串表示形式:

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中的一个bug?你知道吗


Tags: to函数字符串编辑value数字aboutdecimal
2条回答

是虫子吗?我不知道,我认为文件不够严密,无法做出这样的决定。这无疑是一个令人惊讶的结果。你知道吗

用一点逻辑来修正你自己的函数是可能的。你知道吗

def to_sigfigs(value, sigfigs):
    sign, digits, exponent = decimal.Context(prec=sigfigs).create_decimal(value).as_tuple()
    if len(digits) < sigfigs:
        missing = sigfigs - len(digits)
        digits = digits + (0,) * missing
        exponent -= missing
    return str(decimal.Decimal((sign, digits, exponent)))

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

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

另一方面,1正好可以用二进制浮点表示,因此1.0正好是1。由于只需要1位数字就可以用十进制表示,因此上下文的精度不需要任何舍入,您将得到1位十进制结果。你知道吗

相关问题 更多 >