我有这个表情。它在 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
。由于 part3
是 0
对于 i = 0
,结果很清楚。
关于ios - 相同的表达式在 Objective-C 和 Swift 中返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36516685/