NSString的NSDecimalNumber不相等?

时间:2013-03-12 21:37:09

标签: objective-c xcode

我发现了最奇怪的事情。

代码:

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

输出:

 357835487953487345879345897345897345897534
 357835487953487345879345897345897345890000

所以数字不一样,我与浮点数的准确性有关。那么我该怎么办才能让这些变得平等呢?为什么用零替换最后几位?

2 个答案:

答案 0 :(得分:4)

查看NSDecimalNumber

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

当我运行你的代码时,它们是相同的,直到第38位:

357835487953487345879345897345897345897534 357835487953487345879345897345897345890000

答案 1 :(得分:3)

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

357835487953487345879345897345897345897534

存储为

35783548795348734587934589734589734589 * 1E4

较短的号码(即数字较少的数字)不会出现此问题。

来自文档:

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

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

您可能想要查找arbitrary precision arithmetics。看看:GMP。也许它可以帮助你。