2009-06-17 10 views

Odpowiedz

68

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.

+10

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. –

+0

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 ... –

+0

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

4

Użyj wartości dziesiętnej i pieniędzy w DB, jeśli używasz SQL.

2

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(); 
     } 
    } 
} 
0

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.

+0

Brak pliku README, dokumenty i niezaizolowane moduły PR sprzed 2 lat ... –

+0

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

0

W języku C# Należy podać "dziesiętny" w celu przedstawienia kwot pieniężnych.

Powiązane problemy