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-разрядный тип с плавающей запятой.

  • Встроенная панель навигации исчезает на iOS 7 (малый размер экрана), но не iOS 9 (более крупный экран) после выполнения segue
  • Проверьте, существует ли UserDefault - Swift
  • firebase, swift, ios - Не удалось получить токен по умолчанию Error Domain = com.firebase.iid Код = 6 "(null)"
  • Использование неактивного внутри списка захвата, вызывающего сбой, даже сам блок не выполняется
  • выберите данные датчиков (акселерометр, гироскоп), в то время как iPhone заблокирован
  • Невозможно переместить вид клавиатуры iOS9 swift
  • Открытие контроллера просмотра из делегата приложения с помощью swift
  • swift uiview не имеет члена с именем center
  • Как удалить последний компонент пути строки в Swift?
  • Swift - UIImagePickerController - как его использовать?
  • разбор встроенного json с использованием swiftyjson и swift
  • Interesting Posts

    UIImagePickerController не освобождает память, которую он занимает

    Быстрая реализация FBSDKAppInviteDialogDelegate не работает

    XCode 4.2 Beta: могу ли я создать для iOS 4.x?

    Панель инструментов навигации продолжается по вертикали после возврата из полноэкранного видео

    iOS 4.1 Личная горячая точка, отбрасывающая вкладку

    ионная ошибка доступа к ios10 beta

    UILabel sizeToFit работает только с отключенным автозагрузкой

    Пользовательская схема URL, начиная с http не работает

    Задержка при отображении UIButtons после представления SKScene?

    Настроить цвет backgroud NavigationBar на MFMessageComposeViewController

    Встраивание пользовательского шрифта в PDF-файл, созданный приложением iPad

    Проблема с привязкой Monotouch к Cordova (исключение NSInvalidArgumentException)

    Возвращаемое значение после загрузки данных в Alamofire

    Можно ли взаимодействовать с приложением iOS 5 «Напоминания» из моего приложения?

    Представление модала из UITabBarController

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