Какой тип данных лучше всего использовать для денег в C#?
Какой тип данных лучше всего использовать для денег в C#?
9 ответов
Как это описано в десятичной как:
Ключевое слово decimal указывает 128-битный тип данных. По сравнению с типами с плавающей запятой десятичный тип имеет большую точность и меньший диапазон, что делает его подходящим для финансовых и денежных расчетов.
Вы можете использовать десятичное число следующим образом:
decimal myMoney = 300.5m;
Тип десятичного значения представляет собой десятичные числа в диапазоне от положительных 79,228,162,514,264,337,593,543,950,335 до отрицательных 79,228,162,514,264,337,593,543,950,335. Тип десятичного значения подходит для финансовых расчетов, требующих большого количества значащих целых и дробных цифр и без ошибок округления. Тип Decimal не устраняет необходимость округления. Скорее, это минимизирует ошибки из-за округления.
Я хотел бы указать на этот превосходный ответ от zneak о том, почему не следует использовать double.
Используйте шаблон Money из Patterns of Enterprise Application Architecture; укажите сумму в десятичном виде и валюту в виде перечисления.
Десятичный. Если вы выбираете double, вы оставляете себя открытым для ошибок округления
Десятичная дробь имеет меньший диапазон, но большую точность - так что вы не потеряете все эти пенни со временем!
Полная информация здесь:
Согласитесь с шаблоном "Деньги": работать с валютами слишком сложно, если вы используете десятичные дроби.
Если вы создаете класс Currency, вы можете поместить туда всю логику, связанную с деньгами, включая правильный метод ToString(), больший контроль над разбором значений и лучший контроль над делениями.
Кроме того, с классом Currency нет возможности непреднамеренно смешать деньги с другими данными.
Другой вариант (особенно если вы катаетесь в своем собственном классе) - это использовать int или int64 и обозначить четыре младшие цифры (или, возможно, даже 2) как "справа от десятичной точки". Так что "по краям" вам понадобится немного "* 10000" при входе и немного "/ 10000" при выходе. Это механизм хранения, используемый Microsoft SQL Server, см. http://msdn.microsoft.com/en-au/library/ms179882.aspx
Изюминкой этого является то, что все ваше суммирование может быть сделано с помощью (быстрой) целочисленной арифметики.
Большинство приложений, с которыми я работал, используют decimal
представлять деньги. Это основано на предположении, что приложение никогда не будет связано с более чем одной валютой.
Это предположение может основываться на другом предположении, что приложение никогда не будет использоваться в других странах с разными валютами. Я видел случаи, когда это оказалось ложным.
Теперь это предположение оспаривается по-новому: новые валюты, такие как биткойны, становятся все более распространенными, и они не являются специфическими для какой-либо страны. Вполне возможно, что приложение, используемое только в одной стране, может по-прежнему поддерживать несколько валют.
Некоторые люди скажут, что создание или даже использование типа только для денег - это "золотое покрытие", или добавление дополнительной сложности сверх известных требований. Я категорически не согласен. Чем более вездесуща концепция в вашей области, тем важнее приложить разумные усилия, чтобы использовать правильную абстракцию заранее. Если вы хотите увидеть сложность, попробуйте работать в приложении, которое раньше использовало decimal
и теперь есть дополнительный Currency
собственность рядом с каждым decimal
имущество.
Если вы используете неправильную абстракцию заранее, ее замена будет стоить в сто раз больше работы. Это означает потенциальное внесение дефектов в существующий код, и самое приятное то, что эти дефекты, вероятно, будут связаны с денежными суммами, транзакциями с деньгами или просто с деньгами.
И это не так сложно использовать что-то кроме десятичной. Google "Nuget Money Type", и вы увидите, что многие разработчики создали такие абстракции (в том числе и я). Это легко. Это так же просто, как использовать DateTime
вместо того, чтобы хранить дату в string
,
Создайте свой собственный класс. Это кажется странным, но тип.Net не подходит для разных валют.