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

  • Как проверить модель iphone с помощью быстрой
  • Тестирование iOS: есть ли способ пропустить тесты?
  • Ошибка связывания в модульном тесте с использованием URLRequestConvertible
  • Как заставить UIButton на ViewController TabBarController вернуть пользователя к последнему выбранному TabBarViewController (не текущий) в Swift
  • Преобразование массива в строку JSON в swift
  • Получение метаданных в быстром режиме UIImagepickerController
  • Перегрузка функции Swift Protocol
  • SpriteKit playSoundFileNamed crash на iOS 8.3
  • Facebook SDK v4.0 для iOS - FBSDKProfile currentProfile не установлен
  • Swift segue - Представление контроллеров вида на контроллерах отдельного обзора не рекомендуется
  • Почему didDeselectItemAt из UICollectionView выдает ошибку неожиданно найденного nil и сбой приложения Swift?
  • Как достичь той же функциональности, что и приложение для iOS Mail с помощью ячейки с чеклибером?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.