"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Puedo confiar en la precisión `php.ini` de PHP para realizar cálculos monetarios precisos?

¿Puedo confiar en la precisión `php.ini` de PHP para realizar cálculos monetarios precisos?

Publicado el 2024-11-19
Navegar:712

 Can I Rely on PHP's `php.ini` Precision for Accurate Money Calculations?

¿Puedo confiar en la solución alternativa de precisión PHP php.ini para el problema de coma flotante?

Introducción

La aritmética de punto flotante, un tema complejo que a menudo se malinterpreta, impregna los sistemas informáticos modernos. Como la mayoría de los números fraccionarios carecen de una representación binaria exacta, inevitablemente se produce el redondeo. Comprender los matices de las operaciones de punto flotante es crucial, como se describe en "Lo que todo informático debe saber sobre la aritmética de punto flotante".

Preguntas y respuestas


Pregunta 1: ¿Puedo utilizar la solución alternativa de precisión para cálculos precisos de 2 dígitos (por ejemplo, ¿dinero)?

Respuesta: No, no puede confiar en la configuración de precisión de php.ini para obtener una precisión constante de 2 dígitos, incluso para números inferiores a 10^6, porque la precisión la longitud puede aumentar durante los cálculos.

Pregunta 2: proporcione un ejemplo claro donde la solución alternativa de precisión falla.

Respuesta: Considere el siguiente ejemplo con un descuento del 10% aplicado solo al primer kilogramo:

ini_set('precision', 8); // Your precision
$a = 5.88; // Cost of 1kg
$q = 2.49; // User buys 2.49 kg
$b = $a * 0.01; // 10% Discount only on the first kg
echo ($a * $q) - $b;

Salida: 14.5824

Pregunta 3: ¿Qué php.ini? .el valor de precisión es adecuado para cálculos de dinero de 2 dígitos?

Respuesta: La configuración de precisión de PHP es no es una base confiable para cálculos financieros o precisión de punto flotante. Es mejor utilizar bibliotecas o métodos especializados.

Cálculos de ejemplo

Examinemos varios ejemplos para ilustrar las limitaciones de precisión:

$a = 342349.23;
$b = 341765.07;

// Example A: precision = 20
echo $a - $b, PHP_EOL; // 584.15999999997438863
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability)
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.15

// Example B: precision = 14
echo $a - $b, PHP_EOL; // 584.15999999997
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.16

// Example C: precision = 6
echo $a - $b, PHP_EOL; // 584.16
echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16
echo number_format($a - $b, 2), PHP_EOL; // 584.16
echo bcsub($a, $b, 2), PHP_EOL; // 584.00

// Example D: precision = 3
echo $a - $b, PHP_EOL; // 584
echo floatval(round($a - $b, 2)), PHP_EOL; // 584
echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent)
echo bcsub($a, $b, 2), PHP_EOL; // 0.00

Estos ejemplos demuestran las inconsistencias al confiar en la configuración de precisión de PHP para realizar cálculos precisos.

Conclusión

Para cálculos financieros confiables, olvídese sobre punto flotante y use centavos o considere la función number_format para obtener 2 dígitos consistentes precisión.

Actualizar

ini_set('precision', 8);

$a = 0.19;
$b = 0.16;
$c = 0.01;
$d = 0.01;
$e = 0.01;
$f = 0.01;
$g = 0.01;
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3