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 l'archiviazione e la manipolazione dei dati.
Ora mi sono imbattuto in numerosi post che menzionano come double
non sono adatti per le operazioni monetarie a causa degli errori di arrotondamento. Tuttavia, devo ancora trovare una soluzione completa su come i valori monetari dovrebbero essere gestiti nel codice PHP e archiviati in un database MySQL.
Esiste una buona pratica quando si tratta di gestire denaro in modo specifico in PHP?
Le cose che sto cercando sono:
- Come devono essere archiviati i dati nel database? tipo di colonna? taglia?
- Come devono essere gestiti i dati in aggiunta normale, sottrazione. moltiplicazione o divisione?
- Quando devo arrotondare i valori? Quanti arrotondamenti sono accettabili?
- C'è differenza tra gestire valori monetari elevati e valori bassi?
Nota: un codice di esempio MOLTO semplificato di come potrei incontrare i valori del denaro nella vita di tutti i giorni (per motivi di semplificazione sono stati ignorati vari problemi di sicurezza. Naturalmente nella vita reale non avrei mai usato 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 mettere in evidenza più casi d'uso e non prenderlo alla lettera, ovviamente.
Domanda bonus Se devo usare un ORM come Doctrine o PROPEL, quanto sarà diverso usare il denaro nel mio codice.
decimal
tipo in C # ha una precisione limitata ma è perfettamente adatto ai valori monetari.