111.1111-111.1110应等于1
NSLog(@"%@", [[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111111"] decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111110"]]);我用decimalNumberBySubtracting:来计算,但是我得到了0。除了stringValue,我没有将它更改为任何形式的值,所以我认为它不应该有任何精度损失。
结果:

是虫子吗?我在谷歌上试过,答案也是0。

发布于 2014-04-05 16:44:35
你的代码一定有问题。
NSDecimalNumber *x = [NSDecimalNumber decimalNumberWithString:@"1111111111111111"];
NSDecimalNumber *y = [NSDecimalNumber decimalNumberWithString:@"1111111111111110"];
assert([[x decimalNumberBySubtracting:y] isEqualToNumber:[NSDecimalNumber decimalNumberWithString:@"1"]]);编辑
你的问题和最初的计算器图像显示了两个16位数字。
但是,调试器的输出显示您实际上使用的数字要大得多。数一下数字中的有效数字,然后阅读NSDecimalNumber文档的第一段,然后回答您自己的问题。为了便于使用,我将在这里包含文档中的摘要段落。
NSDecimalNumber是NSNumber的一个不可变子类,它提供了一个面向对象的包装器,用于执行基-10算法.实例可以表示任何可以表示为尾数x 10^指数的数字,其中尾数是长达38位的十进制整数,指数是从-128到127的整数。
发布于 2014-04-05 16:42:13
可管理的精度可能是15位,因此1111111111111111丢失了最后一个数字,变为1111111111111110 (在google计算器中,而不是在NSDecimal中)。
编辑:--我尝试了这段代码
NSDecimalNumber *x = [NSDecimalNumber decimalNumberWithString:@"1111111111111111"];
NSDecimalNumber *y = [NSDecimalNumber decimalNumberWithString:@"1111111111111110"];
NSLog(@"(%@,%@),%@",x,y,[x decimalNumberBySubtracting:y]);原木是
(1111111111111111,1111111111111110),1也许你之后做错什么了吗?
https://stackoverflow.com/questions/22883579
复制相似问题