Приложения, использующие десятичную или двойную. , - PullRequest
7 голосов
/ 24 октября 2008

Я хотел посмотреть, используют ли люди десятичные числа для финансовых приложений вместо двойных. Я видел много людей, использующих double повсеместно с непредвиденными последствиями. .

Видите ли вы, что другие делают эту ошибку. , .

Ответы [ 7 ]

8 голосов
/ 24 октября 2008

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

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

5 голосов
/ 24 октября 2008

Да, использование float или double для финансовых операций является распространенной ошибкой, приводящей к огромным страданиям. decimal является наиболее очевидным выбором в этом сценарии.

Для общих знаний хорошее обсуждение каждого из них: здесь (число с плавающей запятой / double) и здесь (десятичное число).

2 голосов
/ 24 октября 2008

Это не так очевидно, как вы думаете. Недавно я попросил контролера крупной корпорации сказать, что он хотел, чтобы его финансовые отчеты соответствовали тому, что будет генерировать Excel, что позволяет сохранять результаты вычислений внутри с максимальной точностью и только округлять в последнюю минуту для отображения. Это означает, что вы не всегда можете сопоставить ответы Excel вручную, используя только отображаемые значения. Он объяснил, что существует несколько алгоритмов для генерации результатов, каждый из которых выполняет округление в другом месте с использованием десятичных значений, поэтому потенциально может генерировать противоречивые ответы, но метод Excel всегда генерирует один и тот же ответ.

Лично я считаю, что он не прав, но так как многие финансовые люди используют Excel, не понимая, как правильно его использовать для финансовых расчетов, держу пари, что многие люди согласны с этим контроллером.

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

1 голос
/ 18 апреля 2009

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

1 голос
/ 24 октября 2008

Если это «научное» измерение (я имею в виду вес, длину, площадь и т. Д.), Используйте double.

Если он финансовый или имеет какое-либо отношение к закону (например, площадь объекта), используйте десятичную дробь.

Сложная часть - округление.

Если налог составляет 2,4%, вы округляете детали или после суммы?

Большую часть времени вам приходится выполнять оба действия (И исправлять различия)

0 голосов
/ 17 мая 2011

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

В таких случаях вы рассмотрите возможность использования числа с плавающей запятой / double, поскольку десятичное число оказывает большое влияние на производительность в системах, где десятичные типы не поддерживаются в аппаратном обеспечении. И все же можно обернуть типы с плавающей запятой в классы более высокого уровня (например, Налог, Комиссия, Баланс, Дивиденд, Цитата, Тик и т. Д.), Которые представляют модель предметной области и инкапсулируют всю логику округления, а также допустимые операторы этих типов. и их взаимодействия. И да - в некоторых проектах я реализовал пользовательские функции округления, позволяющие получить на 20% больше вычислений по сравнению с методами .NET или win32.

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

0 голосов
/ 24 октября 2008

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

...