我期望Decimal
像String
那样对待数字,但我在测试过程中却将小数舍入。
let locale = Locale(identifier: "en_GB")
let price: String? = "1535132527181273627"
let decimal: Decimal? = price != nil ? Decimal(string: price!, locale: locale) : nil
XCTAssertEqual(decimal, 1535132527181273627.0)
结果困扰着我
XCTAssertEqual失败:(“ Optional(1535132527181274000)”)不等于(“ Optional(1535132527181273497.6)”)-
答案 0 :(得分:1)
我尝试了您的代码,结果是:
XCTAssertEqual失败:(“ Optional(1535132527181273627)”)不等于(“ Optional(1535132527181273497.6)”)
在MacBook Pro 2015上使用Xcode 9.4.1
我认为问题在于Double
只能处理15个小数位。因此数字1535132527181273627.0
无法正确表示。看看Double precision - decimal places
答案 1 :(得分:1)
这是Swift编译器的设计问题。 据报告为SR-3317,但已与SR-920重复。
问题在于,即使类型应该为defer(() => doAsyncAction())
.pipe(
repeatWhen(notifications => notifications.pipe(delay(1234)))
);
,文字1535132527181273627.0
也被解析为Double
文字(即,精度有限)。使用Decimal
初始化String
是目前唯一的解决方法。
解决方案是重新设计内置协议ExpressibleByFloatLiteral,以允许更长的数字。
答案 2 :(得分:0)
看起来问题出在测试中,而不是代码。 Swift使用Double来存储测试中的数字,但它不够长,Decimal未被四舍五入,但是要在测试中进行比较的数字是
。解决方案是比较Decimal
。
XCTAssertEqual(price, Decimal(string:"1535132527181273627"))