ios - 相同的表达式在 Objective-C 和 Swift 中返回不同的值

标签 ios objective-c swift math expression

我有这个表情。它在 Objective-C 中。

CGFloat x1 = self.frame.size.width / 2 + ((self.frame.size.width - self.borderWidth * 2 - self.graduationOffset) / 2) * cos((6 * i) * (M_PI / 180) - (M_PI / 2));

这是每个变量/属性的值。它们都是 CGFloat 类型。

self.frame.size.width = 200

self.borderWidth = 3

self.graduationOffset = 10

整个表达式在一个执行 60 次的循环中。 i 的值从 0 开始,一直到 60。在上面的代码示例中,它是 0。

x1 的值为100

我像这样将这个表达式转换为 Swift。

let x1 = Double(frame.size.width / 2 + ((frame.size.width - borderWidth * 2 - graduationOffset) / 2)) * cos(Double((6 * i)) * (M_PI / 180) - (M_PI / 2))

为变量传递相同的值。我得到的结果是 1.17566092718146e-14

我试图将其分解并分别检查值以弄清楚这一点。但这只会造成更多的困惑。因为我最后的结果是0!

CGFloat a = self.frame.size.width / 2 + ((self.frame.size.width - self.borderWidth * 2 - self.graduationOffset) / 2);
NSLog(@"%f", a); // 192.000000
CGFloat b = cos((6 * i) * (M_PI / 180) - (M_PI / 2));
NSLog(@"%f", b); // 0.000000
CGFloat c = a * b;
NSLog(@"%f", c); // 0.000000

我在 Swift 中尝试了相同的方法,但得到了不同的结果。

let a = Double(frame.size.width / 2 + ((frame.size.width - borderWidth * 2 - graduationOffset) / 2))
print(a) // 192.0
let b = cos(Double((6 * i)) * (M_PI / 180) - (M_PI / 2))
print(b) // 6.12323399573677e-17
let c = a * b
print(c) // 1.17566092718146e-14

我整天都在做这个,但无法弄清楚这一切。我想 Objective-C 和 Swift 的表达式求值方式不同?如果有任何帮助,我将不胜感激。

最佳答案

让我们将您的 Obj-C 代码分成 3 部分:

CGFloat x1 = frameWidth / 2 + ((frameWidth - borderWidth * 2 - graduationOffset) / 2) * cos((6 * i) * (M_PI / 180) - (M_PI / 2));

CGFloat part1 = frameWidth / 2;
CGFloat part2 = ((frameWidth - borderWidth * 2 - graduationOffset) / 2);
CGFloat part3 = cos((6 * i) * (M_PI / 180) - (M_PI / 2));

然后您的 Obj-C 版本正在执行 result = part1 + (part2 * part3) (我相信您知道 * 优先于 +) 而你在 Swift 版本中额外的 Double(...) 将表达式转换为 result = (part1 + part2) * part3。由于 part30 对于 i = 0,结果很清楚。

关于ios - 相同的表达式在 Objective-C 和 Swift 中返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36516685/

相关文章:

ios - 如何在 iOS 中使用 React Native 保存下载的文件并在文件应用程序中查看?

ios - 导航标题背景图片不起作用

iOS NSNumberFormatter 货币代码是如何工作的?

ios - for in 循环在内部是如何工作的 - Objective C - Foundation

ios - 如何在 Swift 中将日期转换为字符串

swift - 如何从命令行为 swift 应用程序运行 XCTest?

ios - setStatusBarOrientation 已弃用,如何在 ios10 中更改设备方向

IOS 7 - UiView的动画高度

objective-c - 正确使用FMDB/内存

ios - 选项类型 'String?' 的 AVFoundation 值未解包,应用程序崩溃,不会播放声音