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

时间:2015-12-10 20:49:09

标签: python decimal ieee-754 significant-digits

NB :这个问题与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,即5的有效数字表示为1.0)是字符串'1.0000'。实际输出是字符串'1'。

我是否误解了某些内容,或者这是decimal中的错误?

2 个答案:

答案 0 :(得分:4)

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

当您致电to_sigfigs(0.000001, 5)时,由于从源代码转换为二进制浮点,0.000001已经出现了一些舍入错误。它实际上是9.99999999999999954748111825886258685613938723690807819366455078125E-7。将其舍入为5个有效数字得出decimal.Decimal("0.0000010000")

另一方面,1在二进制浮点中是完全可表示的,因此1.0正好是1.由于只需要1位数来表示十进制,因此上下文的精度不会出现。 t需要任何舍入,并得到1位十进制结果。

答案 1 :(得分:1)

这是一个错误吗?我不知道,我不认为文档足够紧密,无法做出决定。这肯定是一个令人惊讶的结果。

可以用更多的逻辑来修复你自己的功能。

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyReuseIdentifier"];

NSAttributedString *text = [[NSAttributedString alloc] initWithString:@"Some Text"];
cell.textLabel.attributedText = text;

NSMutableParagraphStyle *subtitleParagraphStyle = [NSMutableParagraphStyle new];
subtitleParagraphStyle.minimumLineHeight = 20;

NSMutableAttributedString *subText = [[[NSAttributedString alloc] initWithString:@"Some Subtitle Text"] mutableCopy];
[subText addAttribute:NSParagraphStyleAttributeName value:subtitleParagraphStyle range:NSMakeRange(0, subText.length)];

cell.detailTextLabel.attributedText = subText;