我发现了最奇怪的事情。
代码:
NSString *input = @"357835487953487345879345897345897345897534";
NSLog(@"%@", input);
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:input];
NSLog(@"%@", number);
输出:
357835487953487345879345897345897345897534
357835487953487345879345897345897345890000
所以数字不一样,我与浮点数的准确性有关。那么我该怎么办才能让这些变得平等呢?为什么用零替换最后几位?
答案 0 :(得分:4)
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。也许它可以帮助你。