【发布时间】: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