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 ) приводит к переполнению?

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?
  • как вызвать рейтинг рейтинга от json и показать рейтинг в моем представлении таблицы
  • Как давно пользователь создал сообщение, NSDate (), Манипулируя форматом «времени публикации», созданного
  • iOS Градиент, не перпендикулярный вектору градиента
  • Счетчик шагов HealthKit
  • startFirstResponder иногда не открывает клавиатуру на ios 10
  • UISwitch вкл / выкл не работает iOS10
  • Режим Swift / Enable Editing в контроллере просмотра
  • Подкласс NSManagedObject с отказоустойчивым init в swift
  • Как получить битрейт MP3 в SWIFT
  • Мутирование self (struct / enum) внутри экранирующего закрытия в Swift 3.0
  • Interesting Posts

    Как обнаружить все узлы или определенные узлы в touchBegins

    Почему этот SKPhysicsJointPin не сохранит эти 2 спрайта?

    Невозможно установить Firebase, используя cocoapods. В нем говорится: «Не удалось получить сертификат местного эмитента»

    Почему return return не останавливает программу?

    В ионном каркасе, как установить по умолчанию первую кнопку ионного сегмента в активном состоянии?

    Есть ли среда с открытым исходным кодом, которая упрощает работу с аудио-единицами?

    Как создать фреймворк или библиотеку для других разработчиков, безопасный способ?

    Ограничение размера полезной нагрузки APN (Apple Push Notification)

    Совместите изображение кнопки с правым краем UIButton

    Теория реализации iOS

    Как скомпилировать автоматически созданные приложения для iOS?

    Нажмите «Заголовок», чтобы перейти вверх

    Почему один аварийный журнал символизирует, а не другой?

    iOS7 UILabel визуальный сбой

    iOS8 Touch ID получение ошибки: уже установлен механизм ожидающего пользовательского интерфейса

    Давайте будем гением компьютера.