将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会使数字混乱。我的代码出了什么问题?
答案 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。