У метода 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

Другие вопросы по тегам