iOS: ограничить точность типа данных "double" без преобразования в NSString

70
13

Здесь у меня есть запрос о том, как double работает с их точностью.

Я создал образец, в котором я ввел двойные значения, как показано ниже:

double d = 2.0126161;
double d1 = 2.0126162;
double d2 = 2.0126163;
double d3 = 2.0126164;
double d4 = 2.0126165;

Токовый выход:

Если я установил точку останова и проверил, выполнив команду "po" в lldb, тогда значения отображаются как показано ниже:

(lldb) po d
2.0126160999999998

(lldb) po d1
2.0126162000000001

(lldb) po d2
2.0126162999999999

(lldb) po d3
2.0126164000000002

(lldb) po d4
2.0126165

Я назначаю эти двойники объекту CLLocation широту и долготу, которые имеют тип данных "double".

Здесь, как вы можете видеть вывод, показано, что команда "po" для d4 печатает значение "2.0126165", которое так же, как и значение, которое мы дали явно d4, которое отлично и что я хочу.

Выпуск:

Но команды "po" для d, d1, d2, d3 имеют изменения в значении по сравнению с тем, что мы явно передали.

Это изменение значения d, d1, d2, d3 создает разницу в вычислении, которое мы делаем с использованием double d, d1, d2, d3. И если мы проверим кумулятивный эффект, это показывает, что существуют значительные различия по сравнению с ожидаемым результатом.

Я не хочу округлять значение до определенного количества знаков после запятой, так как это изменяется от значения к значению.

Как я могу d, d1, d2, d3 иметь те же значения, которые были явно инициализированы и не изменяли точность, используя двойной тип данных (проверьте ожидаемый результат ниже)?

Ожидаемый результат:

(lldb) po d
2.0126161

(lldb) po d1
2.0126162

(lldb) po d2
2.0126163

(lldb) po d3
2.0126164

(lldb) po d4
2.0126165

Примечание. Пожалуйста, обратите внимание на то, что я не хочу отображать это значение на экране. Я использую эти двойные значения для математических вычислений, поэтому не нужно преобразовывать точки в NSString, передавая "%.7f" в качестве спецификатора формата для NSString,

спросил(а) 2015-04-21T08:57:00+03:00 5 лет, 2 месяца назад
1
Решение
55

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

Для математических вычислений используйте NSDecimalNumber.

ответил(а) 2015-04-21T09:03:00+03:00 5 лет, 2 месяца назад
39

Вы используете CLLocation, который имеет атрибуты двойного типа (широта и долгота).

double type использует по умолчанию 16 цифр после десятичной точки. Чтобы получить точное значение, которое вы назначили, выполните следующие действия:

double d = 2.0126161000000000; 

Для остальных цифр используйте 0s и отрегулируйте длину до 16.

Надеюсь, это поможет.

ответил(а) 2015-04-21T10:05:00+03:00 5 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема