Decimal
s FloatLiteralType
равно Double
.
Проблема в том, что 106.99
не может быть представлено Double
. Просто вставить его в Decimal
проблематично c:
Decimal(106.99) == 106.98999999999997952 // true
106.99 as Decimal * 100 // 10698.999999999997952
Итак, вам нужно продезинфицировать свои Double
s.
extension Decimal {
init(dollarsAndCents: Double) {
self = Self( (dollarsAndCents * 100).rounded() ) / 100
}
}
extension Decimal {
var dollarsAndCents: (dollars: Int, cents: Int) {
(self * 100 as NSDecimalNumber).intValue
.quotientAndRemainder(dividingBy: 100) as (Int, Int)
}
}
Decimal(dollarsAndCents: 106.99).dollarsAndCents // (dollars: 106, cents: 99)
На практике это нормально, потому что Decimal
для денег. Продезинфицируйте, и вы никогда не столкнетесь с ошибками.