Вы проваливаетесь между ожиданиями поведения десятичных чисел и реальностью того, что Float
и Double
являются двоичными числами с плавающей точкой , то есть дробная часть десятичных чисел - это суммы 1/10, 1/100 и т. д., в то время как для двоичных чисел это суммы 1/2, 1/4 и т. д., а некоторые значения, точные в одном, неточны в другом и наоборот.
Измените свой код, чтобы включить:
let doubleValueOfDecimal : Decimal = Decimal(string:"12.95699999999998")!
let numb = doubleValueOfDecimal as NSDecimalNumber
и результат, вероятно, соответствует ожидаемому:
12.95699999999998
12.956999999999980000
Тип Decimal
является десятичным типом значения с плавающей запятой, NSDecimalNumber
является подклассом NSNumber
, который содержит значение Decimal
.
НТН
(Примечание: вы должны инициализировать Decimal
из строки, поскольку использование числового литерала предполагает использование компилятора Swift с использованием двоичной плавающей запятой в некоторой точке процесса ...)