У метода NumberFormatter string (from: NSNumber) есть проблемы с десятичными разрядами - PullRequest
0 голосов
/ 12 ноября 2018

Вот мой код

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 ]

0 голосов
/ 12 ноября 2018

Вы проваливаетесь между ожиданиями поведения десятичных чисел и реальностью того, что 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 с использованием двоичной плавающей запятой в некоторой точке процесса ...)

0 голосов
/ 12 ноября 2018

Использовать метод-оболочку класса 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

...