У метода NumberFormatter string(from:NSNumber) есть проблемы с десятичными разрядами
Вот мой код
let ns = NumberFormatter.init()
ns.allowsFloats = true
ns.maximumFractionDigits = 18 //This is a variable value
ns.minimumFractionDigits = 18 //This is a variable value
ns.roundingMode = .floor
ns.numberStyle = .decimal
let doubleValueOfDecimal : Double = 12.95699999999998
let numb = NSNumber.init(value: doubleValueOfDecimal)
print(numb)
let string = ns.string(from: numb)
print(string)
Ниже приведен вывод и ввод
doubleValueOfDecimal = 2.95699999999998
Output
2.95699999999998
Optional("2.956999999999980000")
Но если я введу
doubleValueOfDecimal = 12.95699999999998
Выход
12.95699999999998
Optional("12.957000000000000000")
Преобразование строки округляет значение. Может кто-нибудь объяснить мне, как это работает?
Преобразование строки округляет десятичные разряды, когда я хочу, чтобы оно показало точное число.
2 ответа
Вы проваливаетесь между ожиданиями поведения десятичных чисел и реальностью, 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, использующего двоичную плавающую точку в некоторой точке процесса...)
Используйте метод обертки NSNumber
учебный класс. `
print(numb.stringValue)
let ns = NumberFormatter.init()
ns.allowsFloats = true
ns.maximumFractionDigits = 18
ns.minimumFractionDigits = 18
ns.roundingMode = .floor
ns.numberStyle = .decimal
let numb = NSNumber.init(value: doubleValueOfDecimal)
print(numb)
let string = ns.string(from: numb)
print(numb.stringValue)
Ниже выводится для значений 2.95699999999998, 12.95699999999998.
Выход
+2,95699999999998
+2,95699999999998
+12,95699999999998
+12,95699999999998