Я конвертирую числа в чисто английские слова и столкнулся с очень странными ситуациями: NSNumberFormatter
выдает странный результат, меньший, чем желаемый результат, но число, взятое в качестве параметра, не вызывает переполнения.
У меня есть следующий код:
import Foundation
var numberFormatter: NumberFormatter = NumberFormatter()
numberFormatter.numberStyle = .spellOut
var result: String?
result = numberFormatter.string(from: 999999999999999999)
print(result ?? "nil")
и это напечатает eighteen quadrillion fourteen trillion three hundred ninety-eight billion five hundred nine million four hundred eighty-one thousand nine hundred eighty-four
, что эквивалентно 18014398509481984
‹ 999999999999999999
. Если я попытаюсь получить слова из 18014398509481984
, результат будет тем, который я ожидал, строкой, описанной выше. Однако, если я добавлю еще один 9
к 999..
, он вылетает с сообщением:
целочисленный литерал
9999999999999999999
переполняется при сохранении вInt
Вот тест Swift Sandbox, чтобы сделать вопрос более понятно.
Мой фактический вопрос: Предполагая, что вывод первой попытки: 180140398509481984
является своего рода ограничением для numberFormatter.string(from:)
, почему 999999999999999999
не приводит к переполнению, а просто отображает этот предел, а 9999999999999999999
(с дополнительным 9) приводит к переполнению?
180140398509481985
, вы все равно получите180140398509481984
при написании. - person rmaddy   schedule 05.02.2017spellOut
NumberFormatter
. - person rmaddy   schedule 05.02.201718_014_398_509_481_984
, то есть2^54
. - person Rob   schedule 05.02.2017