NSDecimalNumber计算错误

时间:2014-04-05 16:28:37

标签: ios objective-c precision

111 ... 1111 - 111 ... 1110应该等于1

NSLog(@"%@", [[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111111"] decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111110"]]);

我使用decimalNumberBySubtracting:来计算它,但我得到了0。 除了stringValue之外,我没有将它改为任何形式的值,所以我认为它不应该有任何精度损失。

结果:

enter image description here

这是一个错误吗?我在Google上尝试过,它也回答了0。 enter image description here

2 个答案:

答案 0 :(得分:2)

您的代码必定有问题。

NSDecimalNumber *x = [NSDecimalNumber decimalNumberWithString:@"1111111111111111"];
NSDecimalNumber *y = [NSDecimalNumber decimalNumberWithString:@"1111111111111110"];
assert([[x decimalNumberBySubtracting:y] isEqualToNumber:[NSDecimalNumber decimalNumberWithString:@"1"]]);

修改

您的问题和原始计算器图像显示两个16位数字。

但是,您的调试器输出显示您实际上正在使用更大的数字。计算数字中的有效数字位数,然后阅读NSDecimalNumber文档的第一段,然后回答您自己的问题。为了便于使用,我将在此处的文档中包含摘要段落。

  

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

答案 1 :(得分:0)

可管理的精度大概是15位数,所以1111111111111111丢失了最后一位数,变成1111111111111110(在谷歌计算器中,不是NSDecimal)

修改 我试过这段代码

NSDecimalNumber *x = [NSDecimalNumber decimalNumberWithString:@"1111111111111111"];
NSDecimalNumber *y = [NSDecimalNumber decimalNumberWithString:@"1111111111111110"];
NSLog(@"(%@,%@),%@",x,y,[x decimalNumberBySubtracting:y]);

日志是

(1111111111111111,1111111111111110),1

或许你做的事情有问题吗?