PDA

View Full Version : [PHP] Errori con espressioni e dati double


GHz
14-02-2005, 05:29
Ciao a tutti :)

Sto facendo un progetto in PHP e mi capitano dei valori assurdi quando eseguo delle semplici espressioni con valori double, e non riesco a capire come sia possibile :muro:

Questa è la parte di codice che non torna:


$tot1 = 532597.84;
$tot2 = 532252.53;
$tot3 = 10.33;

$risultato = $tot3 + ($tot1-$tot2);
echo "Risultato = ".$risultato;

Eseguendo questa operazione invece di stampare "Risultao = 355.64" stampa "Risultato = 355.63999999994"

Ma com'è possibile? :cry:

Il bello è che non lo fa sempre sto casino....lo fa solo a seconda dei numeri.....:boh:

Nel mio caso specifico, $tot1 viene presa da un file, $tot2 e $tot3 vrengono prese da campi double in una tabella mysql.

Anche provando a fare tutte le conversioni possibili a variabili di tipo double prima di eseguire l'espressione, il risultato non cambia!

Illuminatemi voi! :)

Ciao,
GHz :help: :help: :help: :help: :help:

Fenomeno85
14-02-2005, 11:07
$tot1 è double anche lui non vorrei che fa un cast

~§~ Sempre E Solo Lei ~§~

cionci
14-02-2005, 11:15
Originariamente inviato da GHz
Eseguendo questa operazione invece di stampare "Risultao = 355.64" stampa "Risultato = 355.63999999994"

Aiaiaiaiaiaiaiaiaiiaaiaiaiiaiaiaiiiiiiiiiiiiiiiiiiiiii mi sa che devi andare a trovare nuovamente il nostro amico Corsini...se ti sente... :D

Quel risultato è dovuto al fatto che non tutti i numeri reali sono rappresentabili in un calcolatore... Probabilmente almeno uno dei quattro numeri (probabile che sia il risultato della sottrazione) che prendono parte all'operazione non è rappresentabile in maniera esatta...

Fenomeno85
14-02-2005, 11:22
Originariamente inviato da cionci
Aiaiaiaiaiaiaiaiaiiaaiaiaiiaiaiaiiiiiiiiiiiiiiiiiiiiii mi sa che devi andare a trovare nuovamente il nostro amico Corsini...se ti sente... :D

Quel risultato è dovuto al fatto che non tutti i numeri reali sono rappresentabili in un calcolatore... Probabilmente almeno uno dei quattro numeri (probabile che sia il risultato della sottrazione) che prendono parte all'operazione non è rappresentabile in maniera esatta...

ot cos'è la storia di Corsini che son curioso + di una donna? :fagiano:

scusa era quello che intendevo io alla fine o no?! :wtf:

~§~ Sempre E Solo Lei ~§~

cionci
14-02-2005, 12:47
Originariamente inviato da Fenomeno85
ot cos'è la storia di Corsini che son curioso + di una donna? :fagiano:

scusa era quello che intendevo io alla fine o no?! :wtf:

No...non è un cast...semplicemente con quelle operazioni si accumulano errori di rappresentazione che portano ad un risultato errato (se vai a vedere la percentuale è veramente molto bassa)...

Paolo Corsini è il preside della facoltà di ingegneria di Pisa...

Fenomeno85
14-02-2005, 13:04
Originariamente inviato da cionci
No...non è un cast...semplicemente con quelle operazioni si accumulano errori di rappresentazione che portano ad un risultato errato (se vai a vedere la percentuale è veramente molto bassa)...

Paolo Corsini è il preside della facoltà di ingegneria di Pisa...

:eekk:

questo non lo sapevo

~§~ Sempre E Solo Lei ~§~

GHz
14-02-2005, 14:48
Originariamente inviato da cionci
Aiaiaiaiaiaiaiaiaiiaaiaiaiiaiaiaiiiiiiiiiiiiiiiiiiiiii mi sa che devi andare a trovare nuovamente il nostro amico Corsini...se ti sente... :D

Al massimo il Lopriore....:fagiano:....o il Longo :ops:

Quel risultato è dovuto al fatto che non tutti i numeri reali sono rappresentabili in un calcolatore... Probabilmente almeno uno dei quattro numeri (probabile che sia il risultato della sottrazione) che prendono parte all'operazione non è rappresentabile in maniera esatta...

Si me lo ero immaginato.....ma.....come dovrei fare per risolvere?? :boh:

Si il problema sta nella sottrazione, cmq come ho già detto non lo fa sempre.....e se gli dico di stampare i 3 numeri $tot li stampa bene :cry:

cionci
14-02-2005, 15:04
Puoi fare un arrotondamento alla seconda cifra decimale...usa la funzione round...

GHz
14-02-2005, 16:33
Originariamente inviato da cionci
Puoi fare un arrotondamento alla seconda cifra decimale...usa la funzione round...

Buona idea http://www.webalice.it/landipaolo/immagini/sisi.gif

Sembra che funga bene :)

Tnx :)