Почему uitextfield.text возвращает точный номер поплавки при получении из массива?

StackOverflow https://stackoverflow.com/questions/19825257

Вопрос

У меня есть массив, в котором хранится ввод Textfield.text. Затем я получаю текст в другом месте как поплавок. Это, кажется, дает мне «точное число» из текстового поля.

Пример а

   navtestAppDelegate *appDelegate = 
   (navtestAppDelegate *)[[UIApplication 
    sharedApplication] delegate];

NSMutableArray *storedData = 
 appDelegate.myData;

[storedData replaceObjectAtIndex: myIndex withObject: mytextfield.text];

float number = [[storedData objectAtIndex:myIndex] floatValue];

если mytextfield.text input is 22.8, float number возврат 22.8

Однако,

Пример б

[storedData replaceObjectAtIndex: myIndex withObject: @"22.8”];

float number  = [[storedData objectAtIndex:myIndex] floatValue];

float number возврат 22.7999999

Я не понимаю, почему я получаю точное число в примере a

Это было полезно?

Решение

Значение 22.8 не может быть представлено в бинарной плавающей запятой точно. То, что вы видите, - это представление, основанное на формате дисплея. Различные методы отображения могут использовать разные форматы отображения. Отображение различного количества цифр и округление означает, что как 22,8, так и 22,799999 являются правильными для количества цифр, отображаемых после округления. Обратите внимание, что 22.7999999 было отображено, а не 22,8000000, потому что следующая цифра была 2, поэтому отображаемое значение было закруглено.

Это зависит от базового зависимости, это то, что может быть точным в одном номере базы, возможно, не может быть точным в другой номере. В этом случае 22.8 в базе десятичных чисел не может быть точным в базе двоичных чисел.

По этой причине существует NSDecimal, и причина плавающей запятой не используется для денежных значений.

Это несколько эквивалентно отображению значения PI в Base Decimal, количество цифр бесконечно, поэтому для каждого дисплея кто -то решил, сколько цифр показывать. Интересно, что PI может быть представлен точно (но с пользой) в базе номеров PI. :-)

В случае float а также double Существует конечное количество цифр, которые могут быть представлены.

Другие советы

Попробуйте так:-

[storedData replaceObjectAtIndex: myIndex    
 withObject: [NSNumber 
 numberWithFloat:22.8]];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top