0

我遇到了最奇怪的事情。

代码:

NSString *input = @"357835487953487345879345897345897345897534";
NSLog(@"%@", input);
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:input];
NSLog(@"%@", number);

输出:

 357835487953487345879345897345897345897534
 357835487953487345879345897345897345890000

所以数字不一样,我这与浮点数的准确性有关。那么我能做些什么来让它们相等呢?为什么用零替换最后几位数字?

4

2 回答 2

4

检查NSDecimalNumber的文档

NSDecimalNumber 是 NSNumber 的不可变子类,它提供了一个面向对象的包装器,用于进行 base-10 算术。实例可以表示可以表示为尾数 x 10^exponent 的任何数字,其中尾数是最多 38 位长的十进制整数,指数是从 –128 到 127 的整数。

当我运行您的代码时,它们在第 38 位之前都是相同的:

357835487953487345879345897345897345897534 357835487953487345879345897345897345890000

于 2013-03-12T21:44:24.630 回答
3

因为 NSDecimal 数字的精度有限,所以它用零替换了数字的结尾……所有数字都是。所以在内部,

357835487953487345879345897345897345897534

存储为

35783548795348734587934589734589734589 * 1E4

使用较短的数字(即具有较少重要数字的数字)不会出现此问题。

从文档:

NSDecimalNumber 是 NSNumber 的不可变子类,它提供了一个面向对象的包装器,用于进行 base-10 算术。实例可以表示可以表示为尾数 x 10^exponent 的任何数字,其中尾数是最多 38 位长的十进制整数,指数是从 –128 到 127 的整数。

简而言之,您可能需要其他存储解决方案来保存具有更多重要数字(非零的数字)的数字。

您可能想查找任意精度的算术。看看:GMP。也许它可以帮助你。

于 2013-03-12T21:44:41.440 回答