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".
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.
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
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.
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.
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.
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;
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