Ho ereditato un enorme mucchio di codice legacy scritto in PHP su un database MySQL. La cosa che ho notato è che l'applicazione utilizza doubles
per la memorizzazione e la manipolazione dei dati.
Ora mi sono imbattuto in numerosi post che menzionano come double
non sia adatto per le operazioni monetarie a causa degli errori di arrotondamento. Tuttavia, non ho ancora trovato una soluzione completa su come i valori monetari dovrebbero essere gestiti nel codice PHP e memorizzati in un database MySQL.
C'è una buona pratica quando si tratta di gestire denaro specificamente in PHP?
Le cose che sto cercando sono:
- Come devono essere memorizzati i dati nel database? tipo di colonna? dimensioni?
- Come devono essere gestiti i dati in normali addizioni, sottrazioni. moltiplicazione o divisione?
- Quando devo arrotondare i valori? Quanti arrotondamenti sono accettabili se ce ne sono?
- C'è una differenza tra la gestione di grandi valori monetari e valori bassi?
Nota: Un codice di esempio semplificato MOLTO di come potrei incontrare i valori monetari nella vita di tutti i giorni (vari problemi di sicurezza sono stati ignorati per semplificazione.) Naturalmente nella vita reale non userei mai il mio codice in questo modo:
$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed
$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.
$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?
Spero che tu usi questo codice di esempio come mezzo per tirar fuori più casi d'uso e non prenderlo letteralmente, ovviamente.
Domanda bonus Se devo usare un ORM come Doctrine o PROPEL, quanto sarà diverso usare i soldi nel mio codice.