Який найкращий тип даних використовувати для грошей у C #?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
Який найкращий тип даних використовувати для грошей у C #?
using System.ComponentModel.DataAnnotations;
... [DataType(DataType.Currency)]
msdn.microsoft.com/en-us/library/…
Відповіді:
Як це описано в десятковій формі як:
Десяткове ключове слово вказує на 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. Тип десяткового значення підходить для фінансових розрахунків, що вимагають великої кількості значущих інтегральних і дробових цифр і відсутність помилок округлення. Тип Десяткова не виключає необхідності округлення. Швидше, це мінімізує помилки через округлення.
Я хотів би вказати на відмінну відповідь zneak про те, чому не слід використовувати подвійний.
Використовуйте шаблон грошей із шаблонів архітектури прикладних програм підприємства ; вкажіть суму як десяткову, а валюту - як перерахунок.
Money
нут має мертве посилання github для сайту проекту, так що ... немає документів?
Десяткові. Якщо ви обираєте подвійний, ви залишаєте себе відкритим для помилок округлення
double
може вводити помилки округлення, оскільки плаваюча точка не може точно представляти всі числа (наприклад, 0,01 не має точного подання у плаваючій точці). Decimal
, З іншого боку, робить подання чисел точно . (Компроміс Decimal
має менший діапазон, ніж плаваюча точка) Плаваюча точка може надати вам * ненавмисні * помилки округлення (наприклад 0.01+0.01 != 0.02
). Decimal
може надати помилки округлення, але лише тоді, коли ви просили про це (наприклад, Math.Round(0.01+0.02)
повертає нуль)
double
та ретельно застосовуєте масштабування та округлення домену, коли це доречно, це може бути абсолютно точно. Якщо хтось неохайний в округленні, це decimal
може призвести до семантично неправильних результатів (наприклад, якщо ви додаєте кілька значень, які повинні бути округлені до найближчої копійки, але насправді не спочатку навколо них). Єдине добре в тому decimal
, що масштабування вбудовано.
десятковий має менший діапазон, але більшу точність - так що ви не втрачаєте всі ці копійки з часом!
Повна інформація тут:
Погодьтеся з моделлю грошей: обробка валют є занадто громіздкою, коли ви використовуєте десяткові дроби.
Якщо ви створюєте валютний клас, ви можете вкласти туди всю логіку, що стосується грошей, включаючи правильний метод ToString (), більше контролю над значеннями розбору та кращим контролем поділів.
Крім того, для класу Валюта немає шансів ненавмисно змішати гроші з іншими даними.
Іншим варіантом (особливо, якщо ви прокатуєте власний клас), є використання int або int64, і позначити чотири нижні цифри (або, можливо, навіть 2) як "праворуч від десяткової коми". Тож "по краях" вам знадобиться кілька "* 10000" на виході, а деякі "/ 10000" на виході. Це механізм зберігання даних, використовуваний SQL-сервером Microsoft, див. Http://msdn.microsoft.com/en-au/library/ms179882.aspx
Суть цього полягає в тому, що все ваше підсумовування можна зробити, використовуючи (швидку) цілу арифметику.
Більшість застосунків, з якими я працював, decimal
представляв гроші. Це ґрунтується на припущенні, що заявка ніколи не стосуватиметься більше однієї валюти.
Це припущення може базуватися на іншому припущенні, що додаток ніколи не буде використовуватися в інших країнах з різними валютами. Я бачив випадки, коли це виявилося помилковим.
Тепер це припущення оскаржується по-новому: нові валюти, такі як біткойн, стають все більш поширеними, і вони не характерні для будь-якої країни. Нереально, що додатку, що використовується лише в одній країні, все ще може знадобитися підтримка кількох валют.
Деякі люди скажуть, що створення або навіть використання типу лише для грошей - це «позолочення» або додавання додаткової складності понад відомі вимоги. Я категорично не згоден. Чим більше всюдисуща концепція знаходиться у вашому домені, тим важливіше докласти розумних зусиль, щоб використовувати правильну абстракцію вперед. Якщо ви хочете побачити складність, спробуйте працювати в додатку, який раніше використовувався, decimal
а тепер Currency
поруч із кожною decimal
власністю є додаткова властивість.
Якщо ви використовуєте неправильну абстракцію на передній панелі, її заміна пізніше буде в сто разів більше роботи. Це означає, що потенційно можна ввести дефекти в існуючий код, і найкраще, що ці дефекти, ймовірно, включатимуть гроші, операції з грошима або просто що-небудь з грошима.
І не так складно використовувати щось інше, ніж десятковий. Google "нудний тип грошей", і ви побачите, що численні розробники створили такі абстракції (включаючи мене.) Це просто. Це так само просто, як використовувати DateTime
замість зберігання дати в string
.
Створіть свій власний клас. Це здається дивним, але тип .Net недостатній для покриття різних валют.