Получение значения мусора при конвертации в длинные Objective -C - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь преобразовать NSString в long, но получаю мусор.Ниже мой код:

long t1 = [[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000;
long t2 = [[jsonDict valueForKeyPath:@"detail.fee"]doubleValue] * 10000000000000000;  
NSLog(@"t1: %ld",t1);
NSLog(@"t2: %ld",t2);  

detail.amout = 51,74
detail.fee = 2,72

O / P:
t1: 9223372036854775807 (получение значения мусора здесь)
t2: 27200000000000000 (работает нормально)

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Пока вы читаете, это невозможно с long.Поскольку, похоже, вы занимаетесь финансами по математике, вы должны использовать NSDecimalNumber вместо double для решения этой проблемы.

0 голосов
/ 04 февраля 2019

9223372036854775807 - максимальное значение 64-разрядного знака со знаком long.Я делаю вывод, что [[jsonDict valueForKeyPath:@"detail.amount"]doubleValue] * 1000000000000000000 больше максимального значения long, поэтому, когда вы приводите его к long, вы получаете ближайшее значение, которое может представлять long.

0 голосов
/ 04 февраля 2019

Каждый тип чисел (int, long, double, float) имеет ограничения.Для вашего длинного 64-битного (потому что ваше устройство 64-битного) числа верхний предел составляет: 9 223 372 036 854 775 807 (см. Здесь: https://en.wikipedia.org/wiki/9,223,372,036,854,775,807)

В вашем случае 51,74 * 1 000 000 000 000 000 000 =

51,740,000,000,000,000,000

ХотяДлинный 64 бит имеет максимум только

9,223,372,036,854,775,807

Таким образом, переполнение происходит при значениях 9,223,372,036,854,775,808 и выше. Это то, во что оценивается ваш расчет.

Также следует отметить, чтото, что вы делаете, также вызовет проблемы, если вы работаете только на 64-битной большой дальности, потому что, что происходит, когда ваше приложение работает на 32-битной (например, iPhone 5c или ниже)?

Как правило, плохая идея использовать большие числа,если вы не занимаетесь сложной математикой. Если точность чисел не является критической, то вам следует подумать об упрощении числа, например, 51 740 Г (G = Гига) и т. д.

0 голосов
/ 04 февраля 2019

Это потому, что вы храните переменные типа product to long t1 и t2.

Используйте float или double, и вы получите правильный ответ.

В зависимости от типов данных C:

Целочисленный тип с длинной подписью,Способен содержать по меньшей мере диапазон [-2,247,483,647, +2,147,483,647];таким образом, его размер составляет не менее 32 бит.

Ссылка: https://en.wikipedia.org/wiki/C_data_types

...