ios - NSDecimalNumber 计算错误

标签 ios objective-c precision

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

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

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

结果:

enter image description here

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

最佳答案

你的代码一定有问题。

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

编辑

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

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

NSDecimalNumber, an immutable subclass of NSNumber, provides an object-oriented wrapper for doing base-10 arithmetic. An instance can represent any number that can be expressed as mantissa x 10^exponent where mantissa is a decimal integer up to 38 digits long, and exponent is an integer from –128 through 127.

关于ios - NSDecimalNumber 计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883579/

相关文章:

objective-c - 在 UIWebview 中添加了空格 - 在 iOS7 和 iOS8 中删除了 UIWebView 空格

objective-c - 在 NSTextField cocoa mac 上更改(突出显示?选择?焦点?)

java - 有人能告诉我如何用 double 进行运算吗?

ios - 渲染到CVPixelBuffer产生黑色图像

ios - Google Maps iOS SDK 在每次位置更新后防止相机变焦

iphone - 翻译图形上下文

c# - 如何为外部声明创建绑定(bind)

objective-c - iOS 中的动画背景

c - 理解从整数到 float 的转换

c++ - 比较 float 和 int