W języku C#, jakiego typu danych należy użyć do reprezentowania kwot pieniężnych? Dziesiętny? Pływak? Podwójnie? Chcę zwrócić uwagę: precyzja, zaokrąglenia itdJakiego typu danych należy użyć do reprezentowania pieniędzy w języku C#?
Odpowiedz
Używaj System.Decimal
:
Typ wartości dziesiętne reprezentuje liczb dziesiętnych, od pozytywnego 79,228,162,514,264,337,593,543,950,335 ujemnej 79,228,162,514,264,337,593,543,950,335. Typ wartości dziesiętne jest właściwe do obliczeń finansowych wymagających dużej liczby znaczących integralnych i cyfr ułamkowych i żadnych zaokrągleń błędów. Typ liczby dziesiętnej nie oznacza konieczności zaokrąglania. Zamiast tego minimalizuje błędy z powodu zaokrąglania .
Ani System.Single
(float
) ani System.Double
(double
) są wystarczająco precyzyjne stanie reprezentujących wysoki precyzji liczb zmiennoprzecinkowych bez zaokrąglania błędów.
Decimal jest tym, którego potrzebujesz.
Użyj wartości dziesiętnej i pieniędzy w DB, jeśli używasz SQL.
W języku C# typ dziesiętny faktycznie jest strukturą z przeciążonymi funkcjami dla wszystkich operacji matematycznych i porównania w bazie 10, więc będzie miał mniej znaczące błędy zaokrąglania. Z drugiej strony float (i double) jest zbliżony do zapisu naukowego w systemie binarnym. W rezultacie typy dziesiętne są dokładniejsze, gdy wiesz, jakiej precyzji potrzebujesz.
Run to, aby zobaczyć różnicę w dokładności 2:
using System;
using System.Collections.Generic;
using System.Text;
namespace FloatVsDecimal
{
class Program
{
static void Main(string[] args)
{
Decimal _decimal = 1.0m;
float _float = 1.0f;
for (int _i = 0; _i < 5; _i++)
{
Console.WriteLine("float: {0}, decimal: {1}",
_float.ToString("e10"),
_decimal.ToString("e10"));
_decimal += 0.1m;
_float += 0.1f;
}
Console.ReadKey();
}
}
}
Rozważmy pomocą Money Type for the CLR. Jest to niestandardowy typ wartości (struct), który obsługuje również waluty i obsługuje zaokrąglanie problemów.
Brak pliku README, dokumenty i niezaizolowane moduły PR sprzed 2 lat ... –
Czytałem książkę "Kod adaptacyjny za pośrednictwem C#" (od 2014 r.) i napisano: "nie zaleca się używania typu dziesiętnego do reprezentują wartości walutowe (...) Zamiast tego należy używać typu Money (url sam jak wyżej), byłem zdezorientowany, ponieważ zawsze mówiono mi, żeby używać liczby dziesiętnej .. Autor nie argumentuje, dlaczego nie powinniśmy użyj liczby dziesiętnej W oparciu o to i co George napisał, myślę, że dziesiętny jest drogą do zrobienia. – Marshall
W języku C# Należy podać "dziesiętny" w celu przedstawienia kwot pieniężnych.
- 1. Jakiego typu danych należy użyć dla kodów językowych IETF?
- 2. Jakiego typu danych należy użyć do przechowywania wartości pieniężnych?
- 3. Jakiego typu użyć do danych obrazu w pamięci w Haskell?
- 4. Jaką klasę użyć do reprezentacji pieniędzy?
- 5. Jakiego formularza należy użyć do tworzenia strony internetowej?
- 6. Jaki typ danych XML powinienem użyć dla waluty/pieniędzy?
- 7. Jakiego typu powinienem użyć w dwuwymiarowej tablicy?
- 8. Którą strukturę danych należy użyć do geokodowania?
- 9. Jakiego typu zmiennej można użyć do przechowywania dużych liczb (ponad 30 cyfr) w języku Java?
- 10. Dlaczego należy użyć ciągu znaków w JSON do reprezentowania liczby dziesiętnej
- 11. Którego typu Boolean należy użyć w iOS/Objective-C?
- 12. Kiedy należy użyć przypisania w Objective c?
- 13. Jakiego wyjątku powinienem użyć w przypadku "No Record Found"? (C#)
- 14. jakiego systemu Pythona użyć?
- 15. Jakiego programu ładującego klasy użyć w Parcel.readHashMap?
- 16. C#: Deklaracja stałej zmiennej dla typu danych do użycia
- 17. Jakiego typu kolekcji powinienem użyć, aby uzyskać najlepszą wydajność?
- 18. Jakiego wzoru należy użyć do przetwarzania raportów w infrastrukturę, aby umożliwić różne reprezentacje?
- 19. Jakiego narzędzia należy użyć do zautomatyzowania mojego wdrożenia aplikacji ASP.NET MVC?
- 20. Jakiego wyjątku należy zgłaszać w JavaScript?
- 21. [Sql-Server] jakiego typu danych użyć dla wartości salt hash i wartości hash i jakiej długości?
- 22. Określanie systemu operacyjnego i typu procesora w języku C#
- 23. Jakiego wzoru należy użyć do sprawdzania numerów kart 2 BIN MasterCard
- 24. Casting między typami danych w języku C#
- 25. Gdzie należy użyć Rx?
- 26. Jakiego SRID powinienem użyć w mojej aplikacji i jak?
- 27. Jakiej strategii należy użyć przy eksponowaniu C++ do Lua
- 28. Co muszę użyć do tworzenia gier w języku C#?
- 29. Jaki jest najlepszy typ danych, jakich należy używać dla pieniędzy w aplikacji Java?
- 30. Skąd C wie, jakiego typu można się spodziewać?
Przegrałem to, ale nie zgadzam się z ostatecznym roszczeniem. Nie chodzi o to, że float/double nie są wystarczająco precyzyjne - po prostu używają niewłaściwej bazy do pieniędzy. Mógłbyś mieć 512-bitową zmiennoprzecinkową wartość binarną z bardziej aktualną * precyzją * niż dziesiętną - ale nadal nie byłaby to właściwa, ponieważ nie mogła reprezentować wartości dziesiętnych, takich jak dokładnie 0.1. –
Mój błąd - zmieszałem znaczenie w mojej odpowiedzi. Użyłem "dokładnego" w moim końcowym oświadczeniu, aby nie znaczyć "matematycznej precyzji", ale raczej wyrazić, że zaokrąglona liczba (1 w tym przykładzie) jest "mniej dokładna" niż (0,99999_), gdy numer przypisany do zmiennej był w rzeczywistości 0,9999_. Zły wybór słów z mojej strony ... –
Tak, nawet liczba zmiennoprzecinkowa jest wystarczająca. Problem pojawia się podczas konwersji z dziesiętnego na binarny iz powrotem. Dwie różne bazy mają różne zestawy liczb nieracjonalnych. – Nosredna