3

当我NSNumber使用“floatValue”转换为浮点值时,精度会有所不同。例如,我有一个NSNumber值为 2.3 的“myNumber”,如果我使用“floatValue”将 myNumber 转换为浮点数,它的值变为 2.29999。但我正好需要 2.30000。2.3 之后的零个数没有问题,我需要 '2.3' 而不是 '2.9'。

我该怎么做?

4

4 回答 4

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'

我希望这会有所帮助。:)

于 2014-02-11T13:45:34.997 回答
3

如果您需要精确的精度,请不要使用float. double如果您需要更高的精度,请使用 a 。那仍然不准确。您可以将 myNumber 乘以 10,转换为无符号整数并对其执行算术运算,转换回浮点数或双精度数并除以 10,最终结果可能更精确。如果这些都不够精确,您可能需要查看任意精度算术库,例如GNU MP Bignum

于 2013-02-26T11:19:47.727 回答
1

我已经完成了以下操作,但它正确地显示了我

NSNumber *num = [NSNumber numberWithFloat:2.3];
float f = [num floatValue];
NSLog(@"%f", f);
于 2013-02-26T11:20:41.767 回答
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];
于 2013-02-26T11:21:18.010 回答