Преобразование `NSDecimalNumber` в` SInt64` без потери точности.(в пределах диапазона SInt64, iOS) - PullRequest
1 голос
/ 03 ноября 2010

В настоящее время [NSDecimalNumber longLongValue], созданный со строкой @"9999999999999999", возвращает 10000000000000000.

Это означает, что класс сначала преобразует свое значение в double и повторно преобразует в SInt64 (signed long long)

Как избежать такого поведения?Я хочу получить точное целое число в диапазоне SInt64.

PS.Я подумывал о преобразовании в NSString и повторном преобразовании в SInt64 с NSScanner или strtoll, но я считаю, что есть лучший способ.Но если вы уверены, что другого пути нет, скажите, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 14 октября 2015

Начните с NSDecimalNumber * originalValue.

Пусть int64_t ок = [originalValue longLongValue].Это не будет точно, но довольно близко.

Преобразование прибл. В NSDecimalNumber, вычисление originalValue - прибл., LongLongValue и добавление прибл.Теперь вы получили правильный результат.

0 голосов
/ 06 ноября 2010

Во-первых: если вы не уверены, что это критично для производительности, я запишу его в строку и отсканирую обратно.Это простой способ.

Теперь, если вы действительно хотите сделать это иначе:

  1. получите NSDecimal от вашей NSDecimalNumber
  2. работы счастные поля структуры, инициализируйте ваше значение long long из мантиссы (возможно, введите проверки для обработки слишком больших мантисс)
  3. умножьте на 10 ^ показатель степени;Вы можете сделать это, используя двоичное возведение в степень ;еще раз проверьте на переполнение
...