【问题标题】:set maximumFractionDigits not working设置 maximumFractionDigits 不起作用
【发布时间】:2015-03-23 07:42:05
【问题描述】:

我如下创建了一个 NSNumberFormatter,将最大小数位数设置为 2,当我尝试格式化 @“93.650000”时,它的输出类似于 93.65000000000001。我很困惑,这是怎么回事?

编辑: 我的问题是,我不输出 93.65000000000001 作为字符串,只输出 93.65 作为字符串。

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
f.minimumFractionDigits = 0;
f.maximumFractionDigits = 2;
NSString *valueString;
for (NSString *valueStr in valueStrArray) {
    valueString = valueStr;
    if ((NSNull *)valueString == [NSNull null])
        valueString = @"0";
    NSNumber *value = [f numberFromString:valueString];
    [vArray addObject:value];
}

原值字符串数组:

<__NSCFArray 0x1742e8700>(
95.370000,
93.650000,
76.330000,
73.040000,
70.050000,
69,
66.510000,
57.540000,
53.760000,
<null>
)

格式化的 NSNumber 数组: (lldb) po vArray

<__NSArrayM 0x174c524b0>(
95.37,
93.65000000000001,
76.33,
73.04000000000001,
70.05,
69,
66.51000000000001,
57.54,
53.76,
0
)

【问题讨论】:

  • 这是内部 NSNumber 类型的限制,它将是 64 位浮点的 32 位。它尝试尽可能地存储该值,但没有无限位,必须将其四舍五入到它可以代表的最接近的位。这就是为什么不建议对循环变量使用双精度或浮点数的原因
  • 那我该如何解决呢?
  • @Wingzero 您还没有提出实际问题。你被告知为什么你最后得到了000000000001,但这有什么问题呢?你可以直接忽略它。
  • @trojanfoe 我已经编辑了我的问题。我不在乎它存储的内容,但是当我尝试将这个 93.65000000000001 打印为字符串时,我只想要 93.65。但它给了我@“93.65000000000001”
  • 使用[NSString stringWithFormat:@"%.2f", [numberObject floatValue]] 格式化它。最好还是使用您创建的NSNumberFormatter 对象。

标签: ios objective-c


【解决方案1】:

您可以尝试使用 NSDecimalNumber 而不是 NSNumber 来更好地处理十进制数。 它有一个类方法 +decimalNumberWithString:

【讨论】:

  • 嗯,谢谢...但是有问题的 cmets 已经解决了问题。
【解决方案2】:

@Barnstokkr(在 cmets 中)解释说这是一个浮点舍入错误,如果问题是格式化时数字末尾包含额外的 000000000001,那么只需使用 NSNumberFormatter 对象格式化字符串,或[NSString stringWithFormat:]:

NSString *formatted = [f stringFromNumber:numberObj];
NSString *formatted = [NSString stringWithFormat:@"%.2f", [numberObj floatValue]];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多