Domanda

non riesco ancora a ottenere risultati accurati. Qual è il massimo. quantità di decimali che dovrebbe mostrare se voglio che sia il più precisi possibile?

Alcuni codice (pronto per essere testato e incollato copia):

// 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
*/

dovrebbe deduco che la risposta è 4 ??? Ma ho ancora un problema in linea con un commento

Edit: Io non credo che nessuno capiva le mie prove. So galleggianti sono inesatte. Ma una cosa è 1! = ,98,990123 millions, e altra cosa è 1! = 0.0000. Se ho impostato 4 come la precisione nel bc * Funzione, mi aspetto di ottenere almeno 0,9899 (se la risposta perfetta erano 1), non è 0.0000. Una cosa è 'non perfettamente accurato per infinita precisione', altra cosa è 'del tutto inutile'.

Modifica 2: @ Michael Borgwardt ha la soluzione

È stato utile?

Soluzione

Una delle principali cause del problema è che si sta utilizzando letterali galleggiante. Che causa un errore di arrotondamento quando il codice viene compilato o interpretato e convertito in un binario frazione .

A quel punto, hai già perso - utilizzando le funzioni matematiche bc non aiuterà. Per utilizzare quelli correttamente, è necessario utilizzare stringhe letterali:

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

stamperà:

0.00002000000000000000

Altri suggerimenti

  

Qual è il massimo. quantità di decimali che dovrebbe mostrare se voglio che sia il più precisi possibile?

Il problema inizia con il tentativo di ottenere valori precisi da calcoli in virgola mobile. Non si può in generale ottenere valori precisi da calcoli in virgola mobile a causa di errori di rappresentazione. Il valore 0,0001 non può essere rappresentato esattamente in virgola mobile binario in modo che il valore effettivo memorizzato differirà leggermente da 0,0001 e che già si dà un'imprecisione. Si deve aspettare che le cifre meno significative saranno imprecisi. Visualizzazione più decimali non rende il calcolo più preciso -. Rende solo le imprecisioni intrinseche più visibile

Se avete bisogno di precisione, si dovrebbe utilizzare un tipo di dati differente (bcadd non accettare le stringhe, ma la conversione da un galleggiante in una stringa può ancora introdurre un'imprecisione) o di modificare il programma per consentire risposte che sono un po 'diverso da quello risposta precisa.

Se si desidera solo per visualizzare una soluzione utile è possibile visualizzare per la precisione che abbia un senso per la propria applicazione. Se si sta calcolando la temperatura per impostare un forno per cucinare un tacchino poi arrotondare la risposta ad un paio di cifre significative dovrebbe andare bene. Se stai facendo calcoli scientifici si potrebbe desiderare di visualizzare le risposte con 3, 4 o più cifre significative. Se avete bisogno di precisione del 100%, allora avete bisogno di ripensare il vostro disegno.

"bcadd" richiede tre argomenti. I primi due sono stringhe che rappresentano gli operandi sinistro e destro e uno intero che rappresenta le cifre decimali nel risultato. Questa funzione genera una stringa. Provare a utilizzare un valore di stringa invece di numeri interi nella vostra quinta eco risultato.

Inoltre, per quanto riguarda la precisione dei numeri in virgola mobile (da PHP.net):

La dimensione di un galleggiante dipende dalla piattaforma, anche se un massimo di ~ 1.8e308 con una precisione di circa 14 cifre decimali è un valore comune (64 bit IEEE formato).

Prova a usare la libreria BCMath. E 'fondamentalmente memorizza il numero come una stringa, ma permette di fare l'aritmetica ad esso.

Handling numeri molto grandi o molto piccoli

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top