2010-09-26 12 views
9

Ho una tabella items nel mio database MySQL con un campo DECIMAL(10,2) chiamato price.Il lavoro con i soldi (numeri decimali) in PHP è considerato sicuro?

Quando si prelevano questi valori, è sicuro eseguire calcoli e tali con questi numeri in PHP? O finirò con potenziali errori di arrotondamento e cose del genere che sono comuni quando si lavora con tipi di dati in virgola mobile?

Come fa il PHP a gestire queste cose dietro la copertina? È sicuro fare calcoli di denaro con PHP?

+0

PHP Pet Peeve # 1329: Nessun tipo di dati "decimale". AFAIK, dietro le quinte PHP userà l'aritmetica in virgola mobile in virgola mobile. Allora sì, affronterai [errori di arrotondamento] (http://stackoverflow.com/questions/3726721/php-math-precision/3726761#3726761). – NullUserException

+0

Non ho idea di php, ma staresti meglio usando solo gli interi. È abbastanza facile convertire da centesimi a dollari (o qualsiasi altra cosa) in base alle necessità in seguito. – CurtainDog

+0

Puoi contare su MySQL per i calcoli e PHP solo per lo spettacolo? – Xailor

risposta

8

si potrebbe fare uso di una libreria PHP che fa arbitraria matematica precisione, come ad esempio BC Math o GMP.

Mentre si fa uso di centesimi, o la più piccola unità monetaria possibile funziona a volte, cosa succede se si incontra una situazione in cui si devono affrontare frazioni di centesimi? Ad esempio, se hai a che fare con la vendita e l'acquisto di azioni, devi avere una precisione maggiore rispetto ai centesimi. In situazioni come questa, devi fare uso di matematica di precisione arbitraria.

+1

+1 per la menzione di casi limite in cui trattare con centesimi da soli non funzionerà – alex

10

La maggior parte delle persone misura la valuta nella denominazione più piccola in PHP: ad esempio, $ 10 AU di dollari verrebbero mostrati come 1000 centesimi.

È quindi banale a / 100 ottenere i dollari e non si otterrà ad es. 4.9999999 valori causati dall'aritmetica in virgola mobile.

In alternativa, è possibile utilizzare i valori in virgola mobile e arrotondati al centesimo più vicino (che può essere un multiplo di 5, ad esempio).

Sembra si già sanno su di esso, ma per gli altri, this is still required reading :)

+1

La risposta corretta e il linguaggio agnostico a quello –