Pregunta

todavía no puedo obtener resultados precisos. ¿Cuál es el máximo. cantidad de decimales que debe mostrar si yo quiero que sea lo más preciso posible?

Algunos código (listo para ser copia-pegado y probado):

// Test with 5 decimals 
$a = 0.00001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>';
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/><br/>';

/* Output:
0.00000
0.000000
0.00000
0.000000
0.00000000000000000000
0.00000
0.000000000000000000000
*/

// Test with 4 decimals
$a = 0.0001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>'; // wtf? this outputs 0 too?
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/>';

/* Output:
0.00020
0.000200
0.00020
0.000200
0.00000000000000000000
0.00020
0.000200000000000000010
*/

¿Debo deducir que la respuesta es 4 ??? Pero todavía tengo un problema en la línea con un comentario

Edit: Yo no creo que nadie entiende mis pruebas. Sé que los flotadores son inexactos. Pero una cosa es 1! = 0.98990123, y otra cosa es 1! = 0,0000. Si fijo 4 como la precisión en la función bc *, espero obtener al menos 0,9899 (si la respuesta perfecta fueron: 1), no 0.0000. Una cosa es 'no muy exactos para infinito de precisión', otra cosa es 'completamente inútil'.

Editar 2: @ Michael Borgwardt tiene la solución

¿Fue útil?

Solución

Una de las principales causas de su problema es que estás usando literales flotantes. Eso hace que un error de redondeo cuando el código es compilado o interpretado y se convierte en un binario fracción .

En ese punto, ya has perdido - con ayuda de las funciones matemáticas bc no ayudará. Para utilizar los correctamente, usted tiene que utilizar literales de cadena:

echo bcadd('0.00001','0.00001',20);

Imprimirá:

0.00002000000000000000

Otros consejos

  

¿Cuál es el máximo. cantidad de decimales que debe mostrar si yo quiero que sea lo más preciso posible?

Su problema comienza con el intento de obtener valores precisos de cálculos de punto flotante. No se puede, en general, obtener valores precisos de cálculos de punto flotante debido a errores de representación. El valor de 0,0001 no se puede representar exactamente en el punto flotante binario de modo que el valor almacenado real diferirá ligeramente de 0,0001 y que ya le da una inexactitud. Usted debe esperar que los dígitos menos significativos serán inexactos. Viendo más decimales no hace el cálculo más preciso -. Sólo hace que las imprecisiones inherentes más visible

Si necesita precisión, se debe utilizar un tipo de datos diferente (bcadd no aceptar cadenas, pero la conversión de un flotador a una cadena todavía puede introducir una inexactitud) o cambiar su programa para permitir respuestas que son ligeramente diferente de la respuesta precisa.

Si lo que desea es mostrar una respuesta útil para poder visualizarlo a la precisión que tiene sentido para su aplicación. Si se está calculando la temperatura para establecer un horno para cocinar un pavo redondeando la respuesta a un par de cifras significativas debe estar bien. Si usted está haciendo cálculos científicos es posible que desee mostrar respuestas con 3, 4 o más cifras significativas. Si necesita una precisión del 100%, entonces necesita volver a pensar su diseño.

"bcadd" requiere tres argumentos. Los dos primeros son cadenas que representan los operandos izquierdo y derecho y un número entero que representa el número de decimales en el resultado. Esta función genera una cadena. Trate de usar un valor de cadena en lugar de números enteros en su quinta eco resultado.

Además, en cuanto a la precisión de los números de punto flotante (de PHP.net):

El tamaño de un flotador es dependiente de la plataforma, aunque un máximo de ~ 1.8e308 con una precisión de aproximadamente 14 dígitos decimales es un valor común (el de 64 bits IEEE formato).

Trate de usar la biblioteca BCMath. Básicamente se almacena el número como una cadena, pero le permite hacer la aritmética a la misma.

Manejo de números muy grandes o muy pequeños

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top