2012-06-06 10 views
12

cuando hago la siguiente multiplicación en PHP:Display valor flotante w/o notación científica

$ret = 1.0 * 0.000000001; 

i obtener el resultado: 1,0E-9

Quiero convertir este resultado en el decimal normales notación, ¿cómo puedo hacer esto?

sprintf('%f',$ret) no funciona, devuelve 0.000000. ¿Rebosar?

Respuesta

30

sprintf('%f',$ret) no funciona, devuelve 0.000000. ¿Rebosar?

sprintf funciona, sin embargo, se pierde algo de razón aquí.

0.000000 no se desborda. Es solo que sprintf para el modificador %f usa 6 dígitos por defecto. También tenga cuidado de que %f tenga conocimiento de la configuración regional, %F es probablemente el más adecuado.

Es posible que desee utilizar más dígitos, p. digamos 4 000 000 (cuatro millones):

$ php -r "printf('%.4000000F', 1*0.000000001);" 

Notice: printf(): Requested precision of 4000000 digits was truncated to PHP maximum of 53 digits in Command line code on line 1 

Call Stack: 
    0.0001  319080 1. {main}() Command line code:0 
    0.0001  319200 2. printf() Command line code:1 

0.00000000100000000000000006228159145777985641889706869 

Como muestra este ejemplo, no sólo existe un valor común (6 dígitos), sino también un máximo (probablemente dependía de la PHP sistema informático se ejecuta en), aquí truncado a 53 dígitos en mi caso como muestra la advertencia.

Debido a su pregunta diría que desea mostrar:

0.000000001 

Cuáles son nueve dígitos, por lo que necesita para escribir de esa manera:

sprintf('%.9F',$ret) 

Sin embargo, es posible que desee para hacer esto:

rtrim(sprintf('%.20F', $ret), '0'); 

que eliminará los ceros de la derecha después:

0.000000001 

Espero que esto sea útil.

+0

eres el jefe. estado buscando esto en internet. – Peibol

+1

Después de encontrar esta respuesta, dedico algo de tiempo a la investigación y esta es la mejor respuesta que existe. Puedes usarlo libremente chicos. – Kainax

+0

Usar 'rtrim' en la parte superior de' sprintf' funciona como un amuleto. –

7

Debe agregar el especificador de precisión (cuántos dígitos decimales se deben mostrar para los números de coma flotante). Algo como esto:

echo sprintf('%.10f',$ret); // 0.0000000010 

Si usted no tiene idea de qué cantidad se debe especificar, sólo le dan un número grande y combinarlo con rtrim().

echo rtrim(sprintf('%.20f', $ret), '0'); // 0.000000001 

El código anterior se tira de cualquier 0 's desde el extremo de la cadena.

4

Sugiero el uso de BCMath para una mayor precisión cuando se calcula con números decimales. Eso asegura que realmente obtienes los resultados que deseas.

Para imprimir lo que desea, debe especificar la precisión y usar %.9f, ya que de forma predeterminada muestra 6 números decimales. Eso hace que sea algo como esto (al igual que bsdnoobz ya se dijo):

sprintf('%.9f',$ret); 
+0

El problema es que obtengo todos estos números de una base de datos con varias precisiones. – Johni

+0

Aún así, cuando trabaja con números flotantes, los resultados pueden ser diferentes de los esperados. Si se requiere precisión, use BCMath. Si no te importa si hay un .000000001 (o algo así) agregado en algún lugar, puedes usar flotadores. – ralphje

3

Para alinearse a las configuraciones y limitaciones de su sistema, puede usar serialize_precision para obtener el resultado más preciso posible.

echo rtrim(sprintf('%.'.ini_get('serialize_precision').'f', $ret)); 

No recomiendo el uso de la no-localidad cuenta %F desde su pregunta sólo tiene sentido a efectos de visualización. Respetar la configuración regional contribuye a una mejor experiencia de usuario.

Cuestiones relacionadas