将NSString转换为NSNumber会导致过多的数字和奇怪的舍入

时间:2012-07-03 17:44:17

标签: objective-c ios nsstring nsnumber nsnumberformatter

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

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

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

我不明白为什么转换为NSNumber会使数字混乱。我的代码出了什么问题?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

为什么要使用NSNumberFormatter将字符串转换为float,这将是一种过度杀伤, 要转换它只需使用

NSNumber *num = [NSNumber numberWithFloat:[str floatValue]];

答案 2 :(得分:1)

当我使用NSNumber保存doublevalue时,我遇到了问题 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;
    }

答案 3 :(得分:0)

不要使用floatValue。 floatValue只提供24位精度。 doubleValue提供53位精度。例如,如果您使用超过一百万美元的数字,则floatValue无法为您提供任何相差六美分的值。 ($ 1,000,000,然后$ 1,000,000.06等)

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