Я должен использовать NSDecimalNumber для контакта с деньгами?

53
задан Elijah 24 April 2009 в 09:39
поделиться

4 ответа

У Marcus Zarra есть довольно ясная позиция по этому: , "Если Вы имеете дело с валютой вообще, тогда необходимо использовать NSDecimalNumber". Его статья вдохновила меня изучать NSDecimalNumber, и я был очень впечатлен им. Ошибки плавающей точки IEEE при контакте с основой, 10 математики раздражала меня некоторое время (1 * (0.5 - 0.4 - 0.1) =-0.00000000000000002776) и NSDecimalNumber, покончили с ними.

NSDecimalNumber только добавляет другого немного цифр двоичной точности с плавающей точкой, он на самом деле основывает 10 математики. Это избавляется от ошибок как один показанный в примере выше.

Теперь, я пишу символьное математическое приложение, таким образом, мое требование 30 + точность десятичной цифры и никакие странные ошибки с плавающей точкой могли бы быть исключением, но я думаю, что на это стоит посмотреть. Операции являются немного более неловкими, чем простой var = 1 + 2 математики стиля, но они все еще управляемы. Если Вы волнуетесь по поводу выделения всех видов экземпляров во время Ваших математических операций, NSDecimal является структурой C, эквивалентной из NSDecimalNumber и существуют функции C для того, чтобы сделать те же самые математические операции с ним. По моему опыту, они - много быстро для всех кроме большинства требовательных приложений (3 344 593 дополнения/с, 254 017 подразделений/с на MacBook Air, 281 555 дополнений/с, 12 027 подразделений/с на iPhone).

Как добавленная премия, descriptionWithLocale NSDecimalNumber: метод предоставляет строке локализованную версию числа, включая корректный десятичный разделитель. То же идет наоборот для его initWithString:locale: метод.

64
ответ дан Brad Larson 7 November 2019 в 18:44
поделиться

(Адаптированный из моего комментария к другому ответу.)

Да, Вы должны. Целое число пенсов работает только, пока Вы не должны представлять, скажем, половину цента. Если это происходит, Вы могли бы изменить его для подсчета полуцентов, но что, если тогда необходимо представить четверть цента или одну восьмую цента?

единственным надлежащим решением является NSDecimalNumber (или что-то как он), который откладывает проблему к 10^-128Вў (т.е.
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000001Вў).

(Иначе была бы арифметика произвольной точности, но это требует отдельной библиотеки, такой как библиотека GNU MP Bignum . GMP находится под LGPL. Я никогда не пользовался той библиотекой и не знаю точно, как она работает, таким образом, я не мог сказать, как хорошо она будет работать на Вас.)

[Редактирование: По-видимому, по крайней мере один person— Brad Larson— думает, что я говорю о двоичном файле, с плавающей точкой где-нибудь в этом ответе. Я не.]

5
ответ дан Peter Hosey 7 November 2019 в 18:44
поделиться

Лучший вопрос, когда должен Вы не использование NSDecimalNumber для контакта с деньгами. Короткий ответ на тот вопрос, когда Вы не можете терпеть производительность наверху NSDecimalNumber, и Вы не заботитесь о небольших погрешностях округления, потому что Вы никогда не имеете дело с больше, чем несколькими цифрами точности. Еще более короткий ответ, Вы должны всегда использование NSDecimalNumber при контакте с деньгами.

4
ответ дан Tony 7 November 2019 в 18:44
поделиться

Я нашел удобным использовать целое число, чтобы представить количество центов и затем разделиться на 100 для представления. Избегает целой проблемы.

2
ответ дан wisequark 7 November 2019 в 18:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: