当我使用'floatValue'将NSNumber
转换为浮点值时,精度会有所不同。例如,我有NSNumber
'myNumber',其值为2.3,如果我使用'floatValue'将myNumber转换为float,则其值为2.29999。但我需要2.30000。 2.3之后零的数量没有问题,我需要'2.3'而不是'2.9'。
我该怎么办?
答案 0 :(得分:7)
我有类似的情况,我正在读取值并再次将其分配给浮点变量。
我的问题陈述:
NSString *value = @"553637.90";
NSNumber *num = @([value floatValue]); // 1. This is the problem. num is set to 553637.875000
NSNumberFormatter *decimalStyleFormatter = [[NSNumberFormatter alloc] init];
[decimalStyleFormatter setMaximumFractionDigits:2];
NSString *resultString = [decimalStyleFormatter stringFromNumber:num]; // 2. string is assigned with rounded value like 553637.88
float originalValue = [resultString floatValue]; // 3. Hence, originalValue turns out to be 553637.88 which wrong.
以下更改行后为我工作:
NSNumber *num = @([value doubleValue]); // 4. doubleValue preserves value 553637.9
double originalvalue = [resultString doubleValue]; // 5. While reading back, assign to variable of type double, in this case 'originalValue'
我希望这会有所帮助。 :)
答案 1 :(得分:3)
如果您需要精确的精确度,请不要使用float
。如果您需要更高的精度,请使用double
。这仍然不准确。您可以将myNumber乘以10,转换为unsigned int并对其执行算术,转换回float或double并除以10,最终结果可能更精确。如果这些都不够精确,您可能需要查看任意精度算术库,例如GNU MP Bignum。
答案 2 :(得分:1)
我已完成以下操作,但它正确地向我显示
NSNumber *num = [NSNumber numberWithFloat:2.3];
float f = [num floatValue];
NSLog(@"%f", f);
答案 3 :(得分:0)
你可以玩这样的东西:
float x = 2.3f;
NSNumber *n = [NSNumber numberWithFloat:x];
NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
[fmt setPositiveFormat:@"0.#"];
NSString *s = [fmt stringFromNumber:n];
float f = [s floatValue];