Какой тип данных лучше всего использовать для денег в C #? - PullRequest
389 голосов
/ 28 марта 2009

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

Ответы [ 9 ]

378 голосов
/ 28 марта 2009

Как описано в десятичное как:

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

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

decimal myMoney = 300.5m;
110 голосов
/ 28 марта 2009

System.Decimal

Тип десятичного значения представляет десятичные числа в диапазоне от положительных 79,228,162,514,264,337,593,543,950,335 до отрицательных 79,228,162,514,264,337,593,543,950,335. Тип десятичного значения подходит для финансовых расчетов, требующих большого количества значащих целых и дробных цифр и без ошибок округления. Тип Decimal не устраняет необходимость округления. Скорее, это минимизирует ошибки из-за округления.

Я хотел бы указать на этот превосходный ответ от zneak о том, почему не следует использовать double.

63 голосов
/ 28 марта 2009

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

20 голосов
/ 28 марта 2009

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

15 голосов
/ 28 марта 2009

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

Полная информация здесь:

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

13 голосов
/ 28 марта 2009

Согласитесь с шаблоном «Деньги»: при использовании десятичных знаков обработка валют становится слишком громоздкой.

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

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

9 голосов
/ 17 февраля 2013

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

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

5 голосов
/ 08 февраля 2018

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

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

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

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

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

И не так сложно использовать что-то кроме десятичного числа. Google "Nuget Money Type", и вы увидите, что многие разработчики создали такие абстракции (в том числе и я). Это легко. Это так же просто, как использовать DateTime вместо сохранения даты в string.

4 голосов
/ 28 марта 2009

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

...