2011-01-11 9 views
18

He estado hablando sobre cómo manejar la visualización de divisas y las matemáticas en PHP, y durante mucho tiempo lo he almacenado en MySQL utilizando el tipo DECIMAL, y usando money_format() para formatearlo y mostrarlo en la página web. Sin embargo, hoy miré el prototipo real:Si lidiar con dinero en una carroza es malo, ¿por qué money_format() lo hace?

string money_format (string $format , float $number) 

Estoy un poco confundido ahora. ¡Todo lo que me han dicho es que evite las carrozas por dinero! Pero aquí está, la función de formateo fundamental (digamos cinco veces rápido), emitiendo la entrada a un flotador. number_format() hace lo mismo.

Así que mis preguntas son:

  1. A menos que estoy tratando con centavos fraccionarios o billones de dólares (y yo estoy tratando con ninguno), ¿Debo preocuparme en absoluto sobre mostrando y almacenando (pero nunca haciendo matemáticas) moneda que se ha emitido a un carro flotante? ¿Alguna vez me acercaré al área de tener imprecisiones de punto flotante que cambien mis cifras?

  2. Si la respuesta al n. ° 1 es que realmente debería preocuparme, ¿por qué se construye el money_format() de esta manera?

+5

La mayor parte del INT> peligro de conversión de flotación viene a continuación, hacer matemáticas con los flotadores. 'number_format()' simplemente está haciendo una conversión de tipo "bonita impresión", por lo que es muy poco probable que los decimales repetitivos de bicho raro creados por el proceso de float-ification afecten los resultados. –

+20

PHP no es el epítome de las "mejores prácticas". – Gabe

+0

qué dijo @markb. – time4tea

Respuesta

19

A menos que estoy tratando con fraccionales centavos o billones de dólares (y estoy tratar con ninguno), debería ser preocupa en absoluto acerca de la visualización y almacenamiento de (pero nunca haciendo matemáticas encendido) moneda que se ha lanzado a una carroza? ¿Alguna vez me acercaré al área de que tenga imprecisiones en coma flotante ¿Cambiar mis cifras?

Para fines de redondeo/visualización puros, está seguro siempre que el error absoluto de representación de coma flotante sea inferior a $ 0.005 (por lo que el redondeo al centavo más cercano es el correcto).

Con IEEE 754 de precisión simple, está seguro hasta $ 131,072.00. ($ 131,072.01 se representa como 131.072,015625, que se redondea incorrectamente.)

doble precisión (que de PHP float usos) no falla hasta $ 70,368,744,177,664.01 (que también tiene 0.015625 para los centavos). No tienes nada de qué preocuparte.

Si la respuesta a # 1 es que yo debería estar preocupado de hecho, ¿por qué es money_format() construido de esta manera?

¿Qué tipo de debe it take? PHP no tiene un tipo de decimal incorporado. Tampoco en muchos otros idiomas.

Esto se discute en “Why are floating-point values so prolific?”

+0

Cadena suena como una buena idea como cualquiera. Aunque está empezando a parecerse cada vez más a problemas puramente de representación y no de matemáticas, debería estar perfectamente cómodo con un flotador. Aceptado porque alivió mis temores y más 1ed por el enlace educativo. :) – Andrew

+1

Usted dice "No falla hasta ...", pero ¿qué pasa con las cosas como el interés compuesto? Pequeños errores pueden sumarse. – rjmunro

+0

El OP preguntó sobre la visualización y el almacenamiento, no de matemáticas. – dan04

Cuestiones relacionadas