значение с плавающей точкой изменяется при передаче методу в target-c - PullRequest
2 голосов
/ 15 августа 2010

Хорошо, вот моя ситуация:

У меня есть класс, сгенерированный базовыми данными, Количество, у которого один из его атрибутов 'Значение' помечен как число с плавающей запятой.

Есть удобный метод вКласс количества, который помогает мне установить это свойство:

- (void)setValueValue:(float)value_ {

    [self setValue:[NSNumber numberWithFloat:value_]];

}

Теперь, когда я установлю попробовать установить это значение из контроллера, как это,

Quantity *q = (Quantity *) [NSEntityDescription insertNewObjectForEntityForName:@"Quantity" inManagedObjectContext:self.managedObjectContext];

float qv = 100.0f;

[q setValueValue:qv];

значение устанавливается как 1.40129846e-43

Я установил контрольные точки в обоих расположениях выше, и хотя подсказка правильно отображает значение 100.0 в классе Controller, в методе сеттера отображается неверное значение.

И, в конечном счете, значение, которое хранится в объекте и в БД, является неправильным значением.

Любые подсказки относительно того, что здесь происходит ??

Ответы [ 2 ]

8 голосов
/ 15 августа 2010

1.40129846e-43 - очень интересное число, которое сообщает нам, что здесь происходит.

В частности:

1.40129846e-43 = 100 * 2^-149

Проще говоря, значение, которое вы наблюдаете, это то, что вы получите, если интерпретировать целочисленное значение 100 как кодировку float.

Скорее всего, это происходит из-за того, что вы не включили заголовок, который объявляет метод setValueValue:(float), или что объявление не находится в области действия в том месте, из которого вы вызываете метод. В результате компилятор предполагает, что метод принимает целочисленный аргумент вместо аргумента с плавающей запятой.

Таким образом, вызывающая сторона преобразует ваше значение 100.f в целое число 100, которое затем интерпретируется функцией как кодирование числа с плавающей запятой, которое вы наблюдаете.

Другая возможность состоит в том, что подобное несоответствие типов происходит где-то в вашем коде регистрации.

TLDR: убедитесь, что вы объявили свои функции, прежде чем использовать их на языках Си.

0 голосов
/ 15 августа 2010

В коде, который вы разместили, нет ничего плохого, кроме возможного конфликта имен.Динамический метод доступа будет иметь имя setValue:, поэтому setValueValue: рискует запутать среду выполнения.

Однако, скорее всего, вы смотрите на ошибку регистрации, т.е. данные в порядке, вы просто неправильно их отображаете.Если вы используете NSLog с неправильным типом в формате, вы получите очень большие, бессмысленные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...