比较Swift中的Decimals(不是浮点数)

时间:2017-10-10 01:02:20

标签: swift swift4

我有一个包含以下行的测试用例:

XCTAssert(testVal == value)

valuetestVal都是小数。在大多数情况下,等效性测试给出了预期的结果,但并非总是如此。例如

let value = Decimal(0xFFFF)
... do stuff that generates testVal
XCTAssert(testVal == value) // evaluates false

但是当我看看value和testVal时,它们看起来是一样的。

(lldb) print testVal == value
(Bool) $R0 = false // the condition causing the test to fail
(lldb) print value.description
(String) $R1 = "65535" // what you would expect, given the init
(lldb) print testVal.description
(String) $R2 = "65535" // the same as value. Hmmm...

(lldb) print (testVal - value).isZero
(Bool) $R3 = true // the difference is zero, but they are not equal?

我检查了两个Decimal的所有属性,甚至哈希值都是相同的,但它们评估为不相等。我看到的唯一区别是一个是紧凑的而另一个不是。我没有办法强迫压缩,所以我不知道这是否是一个因素。

使用其他值(如0xFF,65535.1和其他值)进行初始化时,测试会成功比较。

虽然这种行为是浮点数的典型行为,但它应该不会发生在Decimals中,不是吗?

1 个答案:

答案 0 :(得分:0)

好的,发布后不久就找到了答案:它确实与被压缩的十进制有关。来自文档:

  

所有NSDecimal ...算术函数都需要紧凑的NSDecimal参数。

我添加了一行

NSDecimalCompact(&testVal)

比较按预期工作。