2010-02-12 6 views
57

Voglio memorizzare 3.50 in una tabella mysql. Dispongo di un float in cui lo memorizzo, ma memorizza come 3.5, non 3.50. Come posso avere lo zero finale?memorizzando importi in mysql

risposta

89

Non conservare valori monetari come float, utilizzare decimale o tipo numerico:

Documentation for MySQL Numeric Types

EDIT & precisazione:

valori Float sono vulnerabili a errori di arrotondamento sono che hanno limitato la precisione in modo meno non ti importa che ottieni solo 9,99 invece di 10,00 dovresti usare DECIMAL/NUMERIC dato che sono numeri a virgola fissa che non hanno tali problemi.

18

Ha davvero importanza se archivia come 3,5, 3,50 o addirittura 3,500?

Ciò che è veramente importante è come viene visualizzato dopo che è stato recuperato dal db.

O mi manca qualcosa qui?

Inoltre, non utilizzare un float, utilizzare un decimale. Float ha tutti i tipi di problemi di arrotondamento e non è molto grande.

+1

lo faccio parlare il problema di arrotondamento. Il punto è che non dovrebbe preoccuparsi di come viene memorizzato ma di come viene visualizzato. Non archiviare le informazioni finanziarie a 2 cifre decimali: i tassi di cambio sono a 5 e vengono archiviati a 6, ma vengono visualizzati solo come 2. –

+1

(commento irrilevante precedente cancellato). +1 per un buon punto sull'arrotondamento. –

4

Perché si desidera memorizzare "3.50" nel database? 3,5 == 3,50 == 3,5000 per quanto riguarda il database.

La presentazione e la formattazione di figure/date/ecc. Devono essere eseguite nell'applicazione, non nel database.

5

Se si utilizzano i tipi DECIMALE o NUMERICO, è possibile dichiararli come ad esempio DECIMAL (18, 2) che imporrebbe 2 decimali anche se fossero 0. A seconda di quanto grandi valori si prevede, è possibile modificare il valore del valore primo parametro.

16

Per memorizzare i valori è possibile utilizzare un DECIMAL (10,2) campo, quindi è possibile utilizzare la funzione FORMAT:

SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1 
35

non è generalmente una buona idea per memorizzare i soldi come un galleggiante di arrotondamento gli errori possono verificarsi nei calcoli.

Prendere in considerazione l'utilizzo di DECIMAL (10,2).

+1

Anche i numeri come 0.1 e 0.2 sono impossibili da rappresentare in virgola mobile binario, indipendentemente dalla precisione. http: //en.wikipedia.org/wiki/floating point – Ray

0

Il file binario non può rappresentare con precisione i punti mobili con un numero limitato di bit. Non è la perdita così muuch dei dati, ma in realtà gli errori di conversione .. Here's the manual giving examples

È possibile vedere in azione nel browser, vedere di persona in questo frammento di codice.

<script> 
 

 
    var floatSum = 0; 
 

 
    // add 0.1 to floatSum 10 times 
 
    for (var i=0; i<10; i++) { 
 
     floatSum += 0.1; 
 
    } 
 

 
    // if the repetative adding was correct, the floatSum should be equal to 1 
 
    var expectedSum = 10*0.1; // 1 
 

 
    // you can see that floatSum does not equal 1 because of floating point error 
 
    document.write(expectedSum + " == " + floatSum + " = " + (expectedSum==floatSum) + "<br />"); 
 

 

 
    // --- using integers instead --- 
 
    // Assume the example above is adding £0.10 ten times to make £1.00 
 
    // With integers, we will use store money in pence (100 pence (also written 100p) in £1) 
 

 
    var intSum = 0; 
 

 
    // add 0.1 to floatSum 10 times 
 
    for (var i=0; i<10; i++) { 
 
     intSum += 10; 
 
    } 
 

 
    // if the repetative adding was correct, the floatSum should be equal to 1 
 
    var expectedSum = 10*10; // 100 
 

 
    // you can see that floatSum does not equal 1 because of floating point error 
 
    document.write(expectedSum + " == " + intSum + " = " + (expectedSum==intSum) + "<br />"); 
 
    document.write("To display as &pound; instead of pence, we can divide by 100 (presentation only) : &pound;" + intSum/100 + "<br />"); 
 
</script>

Problemi correlati