@gnasher намекнул на проблему, но не объяснил это подробно.
Компьютеры используют двоичную плавающую точку для представления чисел с плавающей запятой внутри.
Число с плавающей запятой обычно хранится как поплавок, так и двойной. На большинстве 64-битных платформ float хранится в 4 байтах, а double хранится в 8 байтах.
Двоичная плавающая точка не может точно представлять множество десятичных значений. Внутренне 68.6 представляется двоичным как значение, которое работает до 68.59999999999999 в десятичном значении. Это самое близкое, что компьютер может получить до 68.6 при сохранении вашего значения в качестве поплавка.
Бинарные значения с плавающей запятой, такие как поплавки и парные разряды, не имеют «числа знаков после запятой». Значение преобразуется в десятичное для отображения, или для преобразования в строку, и всегда потенциал для ошибок округления в этом преобразовании.
Возьмите этот код, например:
float aFloat = 68.6;
NSLog(@"aFloat = %f", aFloat);
Это показывает:
aFloat = 68.599998
Однако этот код:
NSLog(@"aFloat (1 decimal place)= %.1f", aFloat);
Displays:
aFloat (1 decimal place)= 68.6
Строка JSON, которую вы обрабатываете, содержит в ней номера, которые не входят в кавычки. Когда вы конвертируете строку JSON в объект Cocoa, значение «Total» сохраняется как объект NSNumber, возможно, используя внутренний тип double.
Если вам нужно выполнить математику по своему «итоговому» значению, вам нужно, чтобы это число.
Если вы хотите избежать ошибок преобразования десятичного кода, измените код сервера, чтобы отправить значение «Всего» в виде строки (в кавычках), а не числовое значение. Тогда функция JSONObjectWithData
будет держать его в виде строки, "68.6"
В этом случае ваша строка JSON будет выглядеть следующим образом:
{"success":true,"order_id":102232,"Total":"68.6","delivery_time":"7:30PM-10:00PM","delivery_date":"2016-03-25"}
Вы сказали: «Из-за нескольких местах после десятичной в суммарном поле его создания проблем в расчет «. Какая проблема? На стороне iOS или на стороне сервера?
Какой ты прохождения для чтения вариант? –
его 0 по умолчанию –
sometime float недостаточно точен при значениях типа. это не повредит вашей программе, пока вам не понадобится точное значение. когда вы обходите вещи, вы получите то, что хотите здесь. –