首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSDecimalNumber计算缺陷

NSDecimalNumber计算缺陷
EN

Stack Overflow用户
提问于 2014-04-05 16:28:37
回答 2查看 225关注 0票数 1

111.1111-111.1110应等于1

代码语言:javascript
复制
NSLog(@"%@", [[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111111"] decimalNumberBySubtracting:[NSDecimalNumber decimalNumberWithString:@"1111111111111111111111111111111111111110"]]);

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

结果:

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

EN

回答 2

Stack Overflow用户

发布于 2014-04-05 16:44:35

你的代码一定有问题。

代码语言:javascript
复制
NSDecimalNumber *x = [NSDecimalNumber decimalNumberWithString:@"1111111111111111"];
NSDecimalNumber *y = [NSDecimalNumber decimalNumberWithString:@"1111111111111110"];
assert([[x decimalNumberBySubtracting:y] isEqualToNumber:[NSDecimalNumber decimalNumberWithString:@"1"]]);

编辑

你的问题和最初的计算器图像显示了两个16位数字。

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-04-05 16:42:13

可管理的精度可能是15位,因此1111111111111111丢失了最后一个数字,变为1111111111111110 (在google计算器中,而不是在NSDecimal中)。

编辑:--我尝试了这段代码

代码语言:javascript
复制
NSDecimalNumber *x = [NSDecimalNumber decimalNumberWithString:@"1111111111111111"];
NSDecimalNumber *y = [NSDecimalNumber decimalNumberWithString:@"1111111111111110"];
NSLog(@"(%@,%@),%@",x,y,[x decimalNumberBySubtracting:y]);

原木是

代码语言:javascript
复制
(1111111111111111,1111111111111110),1

也许你之后做错什么了吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22883579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档