十进制数非常长

时间:2018-08-24 18:50:23

标签: swift

我期望DecimalString那样对待数字,但我在测试过程中却将小数舍入。

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)”)-

3 个答案:

答案 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"))