5

我希望能够快速测试零是正数还是负数。

let neg: CGFloat = -0
let pos: CGFloat = +0

if pos == neg {
    // this gets executed, but I don't want this
}

上面的代码不像我需要的那样工作,有人可以帮助我吗?

谢谢 ;)

4

2 回答 2

6

有“负零”和“正零”浮点数。您可以通过检查.sign属性来消除歧义,但它们(故意)比较为相等:

let neg: CGFloat = -0.0
let pos: CGFloat = +0.0

print(neg.sign) // minus
print(pos.sign) // plus
print(neg == pos) // true

if (neg == pos && neg.sign == pos.sign) {
    // This is not executed.
}

请注意,您必须在初始化中使用浮点文字(“-0.0”或“+0.0”)。整数文字(“+0”、“-0”)相等并转换为正零。

于 2018-10-25T07:11:30.367 回答
1

基本上,从普通算术角度来看,negpos都是相同的零,因此if pos == neg是正确的。

但是,当涉及到表示浮点数时,CGFloat具有枚举sign属性:FloatingPointSign

如果设置了 self 的符号位,则为减号,否则为加号。实现IEEE 754符号位操作。

因此,您的 if 语句将是:

if neg.sign == pos.sign { } // false
于 2018-10-25T07:17:37.660 回答