2015-06-23 3 views
1

Когда я конвертирую NSNumber в NSDecimalNumber, это преобразование часто неверно.NSNumber для NSDecimalNumber конверсионный выпуск

У меня есть ряд как 92.43, когда я преобразовать это значение в десятичной или двойной [номер decimalValue] или [число] doubleValue значение изменяется как 92.4299999999 ..

я сделал так много вещей, как [NSDecimalNumber decimalNumberWithDecimal: [ number decimalValue], он всегда возвращает «92.429999» к этому числу.

Как использовать NSNumber originalValue десятичное или двойное значение не имеет значения. Я хочу использовать «92.43» это число как «92.43». И почему это значение меняется?

+1

Эта проблема очень распространена и для других языков - хотя компьютеры пытаются, они не идеальны с точностью (к сожалению, для нас, людей: P). Упрощенным решением было бы округлить десятичное число после преобразования –

+0

возможный дубликат [Objective C Issue With Rounding Float] (http://stackoverflow.com/questions/6333711/objective-c-issue-with-rounding-float) –

+0

Спасибо Bucco. Когда я добавляю или умножаю два десятичных значения после этого округления. Но мне интересно, почему это значение меняется, и вы говорили об общих проблемах :) Я получил благодарность. Знаете ли вы, что все равно, как получить первоначальное значение, не округляя. – zapdroid

ответ

-2

Если вам просто нужно напечатать это число, то попробуйте:

NSLog(@"%.2f", decimalNumber); 

Это округлить 92.4299999999 .. на двух знаков после запятой и результат будет:

92,43

+0

Я не хочу точности. Это значение просто пример моей проблемы. Это значение может быть 92.4878. – zapdroid

2

Почему это происходит?

Упрощенное объяснение заключается в том, что оно связано с тем, как компьютеры выполняют вычисления и как представляют собой числа с плавающей запятой. Большинство чисел с плавающей запятой просто не имеют достаточно точного представления, так как они требуют бесконечного количества цифр, которые должны быть представлены, поэтому округление (также известное как ошибка округления или округления).

Что вы можете сделать?

Если вам действительно нужно выполнять точные расчеты (расчет цен, например), вы не должны работать с NSNumber вообще, но использовать NSDecimalNumber весь путь и использовать его для всех расчетов. Самый безопасный способ был бы создать его из строки, например:

NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithString:@"92.34567891"]; 

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

 Смежные вопросы

  • Нет связанных вопросов^_^