如何在 Swift 中初始化 Decimal 而不会丢失精度

How can I initialize Decimal without losing precision in Swift

let decimalA: Decimal = 3.24
let decimalB: Double = 3.24
let decimalC: Decimal = 3.0 + 0.2 + 0.04
print (decimalA)    // Prints 3.240000000000000512
print (decimalB)    // Prints 3.24
print (decimalC)    // Prints 3.24

我完全糊涂了。为什么会发生这些事情?我知道为什么浮点数会丢失精度,但我不明白为什么 Decimal 在存储十进制数时会丢失精度。

我想知道如何在不丢失精度的情况下初始化 Decimal 类型。之所以会出现这些,对我也很有帮助。 抱歉我的英语不好。

问题是所有浮点文字都被推断为类型 Double,这会导致精度损失。不幸的是 Swift 无法将浮点文字直接初始化为 Decimal

如果你想保持精度,你需要从字符串文字而不是浮点文字初始化Decimal

let decimalA = Decimal(string: "3.24")!
let double = 3.24
let decimalC: Decimal = 3.0 + 0.2 + 0.04
print(decimalA) // Prints 3.24
print(double) // Prints 3.24
print(decimalC) // Prints 3.24

请记住,此问题仅发生在浮点文字上,因此如果您的浮点数在运行时为 generated/parsed(例如从文件中读取或解析 JSON),您应该不会面临精度损失问题。