具有有效数字的 NSNumberFormatter 错误地格式化 0.0

Posted

技术标签:

【中文标题】具有有效数字的 NSNumberFormatter 错误地格式化 0.0【英文标题】:NSNumberFormatter with significant digits formats 0.0 incorrectly 【发布时间】:2012-12-16 00:05:14 【问题描述】:

我有一个 NSNumberFormatter 设置为使用有效数字进行格式化,所以它应该只显示正确显示值所需的十进制数字。

当它用于格式化7.0 时,它的工作方式完全符合预期并产生@"7",但当它用于格式化0.0 时,格式化程序产生@"0.0" 而不是预期的@"0"

NSNumberFormatter *doubleValF = [[NSNumberFormatter alloc] init];
[doubleValF setNumberStyle:NSNumberFormatterDecimalStyle];
[doubleValF setRoundingMode:NSNumberFormatterRoundHalfUp];

doubleValF.maximumFractionDigits = 9;
doubleValF.minimumFractionDigits = 0;
doubleValF.minimumSignificantDigits = 0;
doubleValF.maximumSignificantDigits = 30;
[doubleValF setUsesSignificantDigits:YES];

double value1 = 0.0;
NSString *value1String = [doubleValF stringFromNumber:[NSNumber numberWithDouble:value1]];

double value2 = 7.0;
NSString *value2String = [doubleValF stringFromNumber:[NSNumber numberWithDouble:value2]];

NSLog(@"value1=%@", value1String);
NSLog(@"value2=%@", value2String);

当我运行这段代码时,我得到以下输出:

2012-12-15 15:57:03.425 ***Tests[41701:11303] value1=0.0
2012-12-15 15:57:03.426 ***Tests[41701:11303] value2=7

【问题讨论】:

【参考方案1】:

按照 David 的 LaMacchia 的帖子,只需检查零值并设置 sig fig 模式:

if(fabs(value) < 1e-6) 
    self.numberLabelFormatter.usesSignificantDigits = NO;

else 
    self.numberLabelFormatter.usesSignificantDigits = YES;

self.numberLabel.text = [self.numberLabelFormatter stringFromNumber:[NSNumber numberWithDouble:value]];

这可能不是正确的方法,但它对我有用。

【讨论】:

当您看到一个浮点值和 == 一起出现时,您的脑海中应该会响起警笛声,因为您不应该相信该变量在整个值中都是 0.0。 当然。但我不需要太多的准确性,它工作正常。在这种情况下,我并不担心。 计算时不是数字本身的准确性,我指的是 if() 语句是否会评估为真。你可以有一个你认为应该为 0 的数字 0.00000001,但与 0.0 相比它会评估为 false,并且你的 else 子句将触发而不是 if。 您的代码很可能在您每次测试时都能正常工作,但也有可能任意失败。您应该考虑将 if() 语句更改为 if (fabs(value) &lt; 1e-6) 之类的内容,只要值介于 -0.000001 和 0.000001 之间,它将评估为 true。 @KennyWyland 好建议。要测试的确切值是浮点数的 FLT_EPSILON。【参考方案2】:

问题与您将usesSignificantDigits 设置为YES 有关。我相信0.0 中的尾随数字被认为是重要的。

这里对相关问题进行了很好的讨论:https://***.com/a/13110633/1435955

【讨论】:

我阅读了链接的文章,但我不认为它解决了我的具体问题,即仅当值为 0 时才包含 .0。在 7.0 的情况下,不包含.【参考方案3】:

尝试将数字格式化程序的 zeroSymbol 属性设置为@"0"。

doubleValF.zeroSymbol = @"0"; 

【讨论】:

以上是关于具有有效数字的 NSNumberFormatter 错误地格式化 0.0的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSNumberFormatter 生成小数点后尾随零的数字

带有数字样式的 NSNumberFormatter NSNumberFormatterCurrencyStyle 逗号问题

iOS 从 NSNumberFormatter 字符串中取回值

NSNumberFormatter 在 NSCFNumber getObjectValue 上泄漏

NSNumberFormatter 将浮点字符串格式化为整数

使用 NSNumberFormatter 循环中的 Objective C 自动释放