2010-09-22 13 views
14

Quale tipo (in virgola mobile o decimale) viene utilizzato al meglio per archiviare i prezzi in un database mysql?Galleggiante o decimale per i prezzi?

+1

Quale database? Alcuni come Oracle hanno solo decimale – Mark

+0

Vedi [Usa virgola mobile o decimale per l'ammontare del dollaro delle applicazioni contabili?] (Http://stackoverflow.com/questions/61872/use-float-or-decimal-for-accounting-application-dollar-amount "StackOverflow"). – Andrew

+0

È per un database mysql ma se ci sono differenze tra gli altri mi piace ascoltarlo. – tom

risposta

32

I galleggianti non sono esatti e possono introdurre errori di arrotondamento cumulativi. Decimal è il formato migliore per le informazioni finanziarie che devono essere esatte.

+3

Decimale non è esatto - ma non è esatto in un modo che ci aspettiamo. –

+0

Se il significato del commento di Michael non è chiaro, si prega di vedere la sua risposta qui sotto. – MaxVT

9

per i calcoli finanziari usano decimale

Secondo IEEE 754 carri erano sempre binari, solo le nuove IEEE 754R formati decimali definito standard. Molte delle parti binarie frazionarie non possono mai eguagliare la rappresentazione decimale esatta. Qualsiasi numero binario può essere scritto come m/2^n (m, n interi positivi), qualsiasi numero decimale come m/(2^n * 5^n). Poiché i binarys sono privi del fattore primo 5, tutti i numeri binari possono essere esattamente rappresentati da decimali, ma non viceversa.

0.3 = 3/(2^1 * 5^1) = 0.3 

0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125] 

    1/4  1/8  1/16  1/32 

Così, per i calcoli finanziari utilizzano decimale non galleggiare

0

Si prega di utilizzare BigDecimal, in quanto è il migliore per i prezzi, dal momento che pochi centesimi vengono arrotondati correttamente al dollaro.

Joshua Bloch consiglia BigDecimal.

+3

Vedete un tag "java" da qualche parte? –

+0

@ Michael mi hai preso !! . Io uso per cercare nuovi filtri per le domande di java, quindi ho questa domanda. –

1

Quando memorizziamo un numero in float non salviamo il numero esatto, è un'approssimazione. La parte intera ottiene la priorità e la parte frazionaria è simile alla dimensione del testo. Quindi se hai calcoli e hai bisogno di risultati accurati usa Decimal.

13

prezzi sono valori decimali, e calcoli su di essi sono tenuti a comportarsi come frazioni decimali quando si tratta di arrotondamenti, letterali, ecc

Questo è esattamente quali tipi decimali fanno.

I galleggianti sono memorizzati come frazioni binarie, e lo fanno non si comportano come frazioni decimali - il loro comportamento spesso non è quello che le persone usano per calcolare la matematica decimale. Leggi The Floating-Point Guide per spiegazioni dettagliate.

Per i valori di denaro, non utilizzare mai mai tipi di float binari, soprattutto se si dispone di un tipo di decimale perfettamente valido disponibile!