redondeo quitar number_format number money_format money decimals decimales commas php floating-point currency floating-accuracy money-format

quitar - number_format php sin redondeo



Si tratar con dinero en una flotación es malo, ¿por qué lo hace money_format()? (1)

He estado pensando en cómo lidiar con la visualización de moneda y las matemáticas en PHP, y durante mucho tiempo lo he estado almacenando en MySQL usando el tipo DECIMAL , y usando money_format() para formatearlo y mostrarlo en la página web. Sin embargo, hoy miré el prototipo actual:

string money_format ( string $format , float $number )

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

Así que mis preguntas son:

  1. A menos que esté tratando con centavos fraccionados o billones de dólares (y no con ninguno), ¿debería preocuparme en absoluto por mostrar y almacenar (pero nunca hacer cálculos matemáticos) la moneda que se ha convertido en una flotación? ¿Alguna vez me acercaré al área de tener inexactitudes de punto flotante que cambien mis cifras?

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


A menos que esté tratando con centavos fraccionados o billones de dólares (y no con ninguno), ¿debería preocuparme en absoluto por mostrar y almacenar (pero nunca hacer cálculos matemáticos) la moneda que se ha convertido en una flotación? ¿Alguna vez me acercaré al área de tener inexactitudes de punto flotante que cambien mis cifras?

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

Con la precisión simple IEEE 754, estará seguro hasta $ 131,072.00. ($ 131,072.01 se representa como 131072.015625, que se redondea incorrectamente).

La precisión doble (que usa el float de PHP) no falla hasta $ 70,368,744,177,664.01 (que también tiene .015625 por los centavos). No tienes nada de qué preocuparte.

Si la respuesta al # 1 es que realmente debería preocuparme, entonces ¿por qué se construye money_format () de esta manera?

¿Qué tipo debería tomar? PHP no tiene un tipo decimal incorporado. Tampoco muchos otros idiomas.

Esto se discute en "¿Por qué los valores de punto flotante son tan prolíficos?"