2015-05-20 17 views
10

In realtà sto affrontando un grosso problema con diversi siti Web (in realtà 3) basati su Prestashop. Il problema è che PHP o Prestashop arrotonda a caso i prezzi al numero intero più vicino ed è non sistematico.PHP - Problema di comportamento casuale rotondo

La maggior parte delle volte funziona perfettamente, come dovrebbe, ma a volte (possono essere necessarie settimane o mesi tra due problemi), il prezzo è arrotondato. La mia opzione di modalità round è impostata correttamente per visualizzare due decimali.

Il problema può verificarsi quando si modifica un prezzo del prodotto nel back-office o quando il cliente è alla fase di checkout.

Ho provato a riprodurre il problema, quindi ho creato un test di base: recupero le informazioni sul carrello e visualizzo il suo prezzo. Ho aggiornato la pagina molte volte e ho visto il prezzo arrotondato solo poche volte. La cosa più intrigante è che né il contesto né il codice sono cambiati tra l'inizio e la fine del test.

ho cercato aiuto su Google e nessuno sembrava avere questo problema ...

Soggetto con verifica questo problema? Pensi che sia un problema di PHP o di Prestashop? Grazie in anticipo per il vostro aiuto.

ecco il codice della funzione di turno Prestashop sta usando:

round($value, 2, PHP_ROUND_HALF_UP); 

Per informazioni, la versione di PHP 5.4.39.

+0

http://php.net/round - ci sono 4 metodi di arrotondamento. grep attraverso il codice di prestashop per vedere quale (i) sta usando. –

+0

@MarcB Grazie per il tuo suggerimento, ho aggiornato la mia domanda con la funzione utilizzata da Prestashop. – Sebj

risposta

1

Più di 2 anni dopo, abbiamo capito il problema. Era dovuto a php5-fpm che non gestisce le localizzazioni per thread ma per processo. E 'davvero evidente in PHP documentation:

Attenzione L'informazione locale viene mantenuta per ogni processo, non per thread. Se esegui PHP su un'API di server con multithreading come IIS, HHVM o Apache su Windows, potresti riscontrare improvvisi cambiamenti nelle impostazioni locali mentre è in esecuzione uno script, sebbene lo script stesso non abbia mai chiamato setlocale(). Ciò accade a causa di altri script in esecuzione in thread diversi dello stesso processo allo stesso tempo, modificando le impostazioni internazionali del processo utilizzando setlocale().

Poiché il separatore decimale è stato modificato, PHP non ha riconosciuto i decimali e ha troncato i miei numeri.

0

Forse c'è un problema se il prezzo ha un separatore di migliaia come 12,300.20?

Si prega di avere a mente quanto segue:

Nota: PHP non gestisce le stringhe come "12,300.2" in modo corretto per impostazione predefinita. Vedi la conversione da stringhe.

See: http://php.net/round

0

Potrebbero esserci problemi con le impostazioni locali. In tedesco, ad esempio, migliaia di separatori e punti decimali sono il contrario. Se non si sta gestendo con molta attenzione, è possibile che i valori errati vengano memorizzati in modo persistente o che vengano interrotti alcuni valori durante il lancio su float. Ricorda che quando si calcola con le stringhe (es .: "2,55") php le getterà in virgola mobile, la gestione dei numeri tedeschi ("2,55") determinerà il numero in virgola mobile errato.

(float) "2.55" = 2.55 
(float) "2,55" = 2 

Il problema può essere risolto configurando correttamente le impostazioni locali.

Se si è in grado di distinguere un risultato errato da un valore valido automaticamente, è possibile che si desideri registrare il debug_backtrace in quel punto per valutare il flusso dei programmi in quel caso.