111 ... 1111 - 111 ... 1110应该等于1
NSLog(@"%@", [[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111111"] decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111110"]]);
我使用decimalNumberBySubtracting:
来计算它,但我得到了0。
除了stringValue之外,我没有将它改为任何形式的值,所以我认为它不应该有任何精度损失。
结果:
这是一个错误吗?我在Google上尝试过,它也回答了0。
答案 0 :(得分:2)
您的代码必定有问题。
NSDecimalNumber *x = [NSDecimalNumber decimalNumberWithString:@"1111111111111111"];
NSDecimalNumber *y = [NSDecimalNumber decimalNumberWithString:@"1111111111111110"];
assert([[x decimalNumberBySubtracting:y] isEqualToNumber:[NSDecimalNumber decimalNumberWithString:@"1"]]);
修改强>
您的问题和原始计算器图像显示两个16位数字。
但是,您的调试器输出显示您实际上正在使用更大的数字。计算数字中的有效数字位数,然后阅读NSDecimalNumber
文档的第一段,然后回答您自己的问题。为了便于使用,我将在此处的文档中包含摘要段落。
NSDecimalNumber
是NSNumber
的不可变子类,提供了一个 用于执行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
或许你做的事情有问题吗?