我有这个表情。在目标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
=200self.borderWidth
=3self.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
我在斯威夫特身上也做了同样的尝试,结果却不一样。
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代码分成三部分:
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/