Вопрос

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

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

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

Решение

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

  

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

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

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

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

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

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

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

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

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

Самое сложное — округление.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top