2

NSString包含带两位数的标准十进制数(例如 8.20)的 a 转换为 a时,当通过记录结果或将其保存在 Core Data 中(作为浮点数或双精度数)NSNumber时,我会(不时)得到额外的数字和奇怪的舍入行为NSLog),例如 8.20 -> 8.199999999999999。

这是我用来转换数字的代码:

 NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
 [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
 [numberFormatter setMaximumFractionDigits:5];
 NSNumber *num = [numberFormatter numberFromString:str];

我不明白为什么转换为 NSNumber 会弄乱数字。我的代码有什么问题?

4

4 回答 4

2

这就是 float 和 double 在 C/Objective-C(和许多其他语言)中的行为方式。例如,当您输入 python 8.0 时,结果将是 8.000000000001。我建议使用NSScanner将它们转换为原始数字类型(double、float)。

于 2012-07-03T17:49:40.067 回答
1

为什么要使用 NSNumberFormatter 将字符串转换为浮点数,这将是一个矫枉过正,要转换它只是使用

NSNumber *num = [NSNumber numberWithFloat:[str floatValue]];
于 2012-07-03T17:56:56.583 回答
1

当我使用 NSNumber 保存 8.28 的双值时遇到问题,总是显示 8.2799999999 ...,我猜它是由计算机数值精度引起的试试这个代码。

 + (NSString *)dealWithDouble:(double)doubleValue {
        double d2 = doubleValue;
        NSString *d2Str = [NSString stringWithFormat:@"%lf", d2];
        NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:d2Str];
        NSString *str2D = [num stringValue];
        return str2D;
    }
于 2016-09-30T06:39:06.147 回答
0

不要使用浮点值。floatValue 仅提供 24 位精度。doubleValue 给出 53 位精度。例如,如果您使用超过一百万美元的数字,floatValue 无法为您提供任何相差小于 6 美分的值。(1,000,000 美元,然后是 1,000,000.06 美元等)

规则是:除非您知道应该使用 float 而不是 double 的原因,否则不要使用 float。

于 2014-02-11T12:08:02.300 回答