我有一个包含以下行的测试用例:
XCTAssert(testVal == value)
value
和testVal
都是小数。在大多数情况下,等效性测试给出了预期的结果,但并非总是如此。例如
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中,不是吗?
答案 0 :(得分:0)
好的,发布后不久就找到了答案:它确实与被压缩的十进制有关。来自文档:
所有NSDecimal ...算术函数都需要紧凑的NSDecimal参数。
我添加了一行
NSDecimalCompact(&testVal)
比较按预期工作。