NSNumberFormatter.string (from:) максимально возможное превышенное значение не приводит к переполнению – Swift

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

целочисленный литерал 9999999999999999999 переполняется при сохранении в Int

Вот тест Swift Sandbox Test , чтобы сделать вопрос более понятным .


Мой фактический вопрос: если предположить, что результат первой попытки: 180140398509481984 – это какой-то предел для numberFormatter.string(from:) , почему 999999999999999999 не приводит к переполнению, а просто отображает этот предел и 9999999999999999999 (с дополнительным 9 ) приводит к переполнению?

One Solution collect form web for “NSNumberFormatter.string (from:) максимально возможное превышенное значение не приводит к переполнению – Swift”

9_999_999_999_999_999_999 вызывает переполнение Int потому что оно больше, чем Int64.max равно 9_223_372_036_854_775_807 (т. 0x7fffffffffffffff ).

Относительно того, почему 18_014_398_509_481_984 закрывается на 18_014_398_509_481_984 (т. 18_014_398_509_481_984 2 54 , 0x40000000000000 ) для .spelledOut , это кажется подозрительным, как ошибка, связанная с 64-битными представлениями с плавающей запятой значения. Мы не можем быть уверены, не перейдя к источнику NSNumberFormatter и NSNumber в деталях, но я предлагаю это, потому что верхний потолок здесь, по совпадению, точно удваивает наибольшее целочисленное значение, которое может захватывать 64-разрядный тип с плавающей запятой.

  • Swift - Оператор Switch не работает
  • показать alertController из пользовательского класса
  • Отправить весь трафик через VPN-соединение Swift
  • Swift TableView Crash: «Отсутствует ячейка для вновь видимой строки»
  • Как оставаться на связи с mqtt broker после того, как я прекратил свое приложение (ios, Swift)
  • Позиция iAd баннера не обновляется
  • Ошибка EXC_BAD_ACCESS KERN_INVALID_ADDRESS
  • Как использовать случайные и ограничения в области
  • Как оживить изменение цвета заливки на UIBezierPath?
  • Почему не пересылает геокодирование с помощью CLGeocoder.geocodeAddressString на игровой площадке?
  • Контактное изображение не отправляется, когда контакт сохранен CNContact
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.