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
中的错误?
答案 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;