Какой тип данных лучше всего использовать для денег в C#?

какой тип данных лучше всего использовать для денег в C#?

9 ответов


как описано в decimal as:

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

вы можете использовать десятичное число следующим образом:

decimal myMoney = 300.5m;


использовать деньги pattern С Шаблоны архитектуры корпоративных приложений; укажите сумму как десятичную, а валюту как перечисление.


Decimal. Если вы выбираете double, вы оставляете себя открытым для ошибок округления


decimal имеет меньший диапазон, но большую точность-так что вы не потеряете все эти копейки с течением времени!

все подробности здесь:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx


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

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

кроме того, с классом валюты нет возможности непреднамеренно смешивать деньги с другими данными.


другой вариант (особенно если вы катите свой собственный класс) - использовать int или int64 и обозначить нижние четыре цифры (или, возможно, даже 2) как "право десятичной запятой". Таким образом," по краям "вам понадобится" * 10000 "по пути и" / 10000 " по пути. Это механизм хранения, используемый SQL Server Microsoft, см. http://msdn.microsoft.com/en-au/library/ms179882.aspx

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


создайте свой собственный класс. Это кажется странным, но тип .Net неадекватен для покрытия разных валют.


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

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

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

некоторые люди скажут, что создание или даже использование типа только за деньги-это "золотое покрытие" или добавление дополнительной сложности за пределами известных требований. Я категорически не согласен. Чем более вездесущая концепция находится в пределах вашего домена, тем более важно приложить разумные усилия, чтобы использовать правильный абстракция впереди. Если вы хотите увидеть сложность, попробуйте работать в приложении, которое использовало decimal и вот еще Currency недвижимость рядом с каждым decimal собственность.

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

и не так уж сложно использовать что-то другое, кроме decimal. Google "NuGet money type", и вы увидите, что многие разработчики создали такие абстракции (включая меня. Это просто. Это так же просто, как использовать DateTime вместо хранения даты в string.