2009-06-17 7 views

risposta

68

Uso System.Decimal:

Il tipo di valore decimale rappresenta numeri decimali che vanno dal positivo 79.228.162.514.264.337.593.543.950.335 a negativo 79.228.162.514.264.337.593.543.950.335. Il tipo di valore decimale è appropriato per i calcoli finanziari richiedono gran numero di cifre integrali e frazionari significative e non arrotondamento errori. Il tipo decimale non elimina la necessità di arrotondare. Piuttosto, riduce al minimo gli errori dovuti all'arrotondamento .

System.Single (float)System.Double (double) sono abbastanza preciso grado di rappresentare alta precisione numeri in virgola mobile senza errori di arrotondamento.

+10

Ho svalutato questo problema, ma sono contrario al reclamo finale. Non è che float/double non sono abbastanza precisi - è solo che usano una base inadeguata per soldi. Si potrebbe avere un valore di punto binario mobile a 512 bit con una * precisione * più effettiva del decimale, ma non sarebbe comunque appropriato in quanto non può rappresentare esattamente valori decimali come 0.1 esattamente. –

+0

Mio errore - ho un significato misto nella mia risposta. Nella mia affermazione finale ho usato "preciso" per non significare "precisione matematica", ma piuttosto per esprimere che un numero arrotondato (1 in questo esempio) è "meno preciso" di (0.99999_) quando il numero assegnato alla variabile era in effetti 0.9999_. Scarsa scelta di parole da parte mia ... –

+0

Sì, anche un float è _precise_ sufficiente. Il problema si presenta quando si converte da decimale a binario e viceversa. Le due basi differenti hanno serie diverse di numeri irrazionali. – Nosredna

3

Decimal è quello che si desidera.

4

Utilizzare decimale e denaro nel DB se si utilizza SQL.

2

In C#, il tipo Decimale è in realtà una struttura con funzioni sovraccariche per tutte le operazioni matematiche e di confronto nella base 10, quindi avrà errori di arrotondamento meno significativi. Un float (e double), d'altra parte è simile alla notazione scientifica in binario. Di conseguenza, i tipi decimali sono più accurati quando si conosce la precisione necessaria.

Esegui questo per vedere la differenza nella precisione del 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

considerare l'uso della Money Type for the CLR. È un tipo di valore personalizzato (struct) che supporta anche valute e gestisce l'arrotondamento dei problemi.

+0

Nessun README, documenti e PR non separati di 2 anni fa ... –

+0

Stavo leggendo il libro "Codice adattivo tramite C#" (dal 2014) e si dice: "non è consigliabile utilizzare il tipo decimale per rappresentano i valori di valuta (...) .Si dovrebbe invece usare un tipo di valore Money (url same come sopra) .Sono confuso perché mi è sempre stato detto di usare decimal L'autore non spiega perché non dovremmo usa il decimale Basandomi su quello e su quello che George ha scritto, immagino che decimale sia la strada da percorrere. – Marshall

0

In C# È necessario prendere "Decimale" per rappresentare importi monetari.

Problemi correlati