2010-10-19 6 views

risposta

5

Usa: bcadd()

echo bcadd(10359023529, 0.2137582935, 10); 
3

Questa è la limitazione di un valore in virgola mobile. Un valore in virgola mobile è memorizzato come coefficiente ed esponente. Avrai molta precisione con numeri piccoli e bassa precisione con numeri alti. Ecco più dettagli di quelli desiderati: http://en.wikipedia.org/wiki/IEEE_754-2008

Linea inferiore: i valori alti saranno molto imprecisi. Prova a utilizzare un intervallo di valori limitato.

Ecco di più sul punto di precisione floating specificamente per quanto riguarda PHP: http://php.net/manual/en/language.types.float.php

Se davvero bisogno di alta precisione e un numero elevato, guarda aC matematica (http://www.php.net/manual/en/ref.bc.php) e GMP (http://www.php.net/manual/en/ref.gmp.php).

1

C'è un'opzione oscuro php.ini che definisce il numero di cifre significative per mostrare quando si stampano i numeri in virgola mobile. Nel mio caso si presenta come segue

; The number of significant digits displayed in floating point numbers. 
; http://php.net/precision 
precision = 14 

Naturalmente questo occupa solo di formattazione, non il fatto fondamentale che numeri in virgola mobile sono intrinsecamente imprecise. Secondo IEEE 754 la precisione del doppio è di 15,95 cifre decimali.

+0

La precisione dell'output non è il problema; il tipo di dati float è solo così preciso. – meagar

+0

In linea di principio hai ragione, ma in questo caso particolare non ha superato la doppia precisione. –

+0

@Adam credo che l'abbia fatto, in realtà; altrimenti la sua attuazione è stata specificamente previsto per mostrare un solo decimale quando vengono emessi numeri in virgola mobile, come default è 14. – meagar