我有这个表情。在目标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

我在斯威夫特身上也做了同样的尝试,结果却不一样。
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。因为part30i = 0,所以结果很清楚。

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

10-16 09:46