Swift 具有超长数字的十进制数

Swift 具有超长数字的十进制数,swift,Swift,我希望Decimal将数字视为字符串,但我在测试过程中重复了小的舍入 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)

我希望
Decimal
将数字视为
字符串
,但我在测试过程中重复了小的舍入

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)
结果让我很困扰:

XCTASERTEQUAL失败:(“可选(1535132527181274000)”不等于(“可选(1535132527181273497.6)”)-


我尝试了你的代码,结果是:

XCTASERTEQUAL失败:(“可选(1535132527181273627)”)不等于(“可选(1535132527181273497.6)”)

在MacBook Pro 2015上使用Xcode 9.4.1


我认为问题在于,
Double
只能处理15位小数。因此,无法准确表示数字
1535132527181273627.0
。看看

我尝试了你的代码,结果是:

XCTASERTEQUAL失败:(“可选(1535132527181273627)”)不等于(“可选(1535132527181273497.6)”)

在MacBook Pro 2015上使用Xcode 9.4.1


我认为问题在于,
Double
只能处理15位小数。因此,无法准确表示数字
1535132527181273627.0
。看看

,问题似乎出在测试中,而不是代码中。Swift使用Double来存储测试中的数字,但它不够长,十进制没有四舍五入,但测试中要比较的数字是四舍五入

解决方法是比较
十进制

XCTAssertEqual(price, Decimal(string:"1535132527181273627"))

看来问题出在测试中,而不是代码中。Swift使用Double来存储测试中的数字,但它不够长,十进制没有四舍五入,但测试中要比较的数字是四舍五入

解决方法是比较
十进制

XCTAssertEqual(price, Decimal(string:"1535132527181273627"))

这是Swift编译器的一个设计问题。 已报告为,但已作为的副本关闭

问题是,文本
1535132527181273627.0
被解析为
Double
文本(即精度有限),即使类型应该是
Decimal
。使用
字符串
初始化
十进制
是目前唯一的解决方法


解决方案是重新设计内置协议以允许更长的数字。

这是Swift编译器的设计问题。 已报告为,但已作为的副本关闭

问题是,文本
1535132527181273627.0
被解析为
Double
文本(即精度有限),即使类型应该是
Decimal
。使用
字符串
初始化
十进制
是目前唯一的解决方法


解决方案是重新设计内置协议,以允许更长的数字。

的可能副本确保您了解
十进制
的功能。它当然不会将数字视为
字符串
。它只是使用十进制算法。此外,它不支持任何长度的数字,它支持35位十进制数字。请确保您了解
十进制
的功能。它当然不会将数字视为
字符串
。它只是使用十进制算法。此外,它不支持任何长度的数字,它支持35位十进制数字。为什么不将字符串设置为非可选
let locale=locale(标识符:“en_GB”)
let price=“1535132527181273627”
let decimal=decimal(string:price)
@LeoDabus这只是我正在使用的规范的一部分,来自服务器的价格是可选的,所以我想在单元测试中将其与相同的可选类型进行比较。为什么不将字符串设为非可选
let locale=locale(标识符:“en_GB”)
let price=“1535132527181273627”
let decimal=decimal(string:price)
@LeoDabus这只是我正在使用的规范的一部分,来自服务器的价格是可选的,所以我想在单元测试中将其与相同的可选类型进行比较。