Qualcuno mi spiega il risultato di questo??
<script>
var pippo = 1.2
var pluto = 2.4
alert(pippo + pluto)
</script>
tutti.. o almeno io... mi aspetterei un bel 3.6
e invece...
3.599999999999999999996
Qualcuno mi spiega il risultato di questo??
<script>
var pippo = 1.2
var pluto = 2.4
alert(pippo + pluto)
</script>
tutti.. o almeno io... mi aspetterei un bel 3.6
e invece...
3.599999999999999999996
... gestione dei float in Javascript è un pò contorta...
Potresti scrivere
<script>
var pippo = 1.2
var pluto = 2.4
alert(Math.ceil(pippo + pluto))
</script>
per ottenere in stampa 4, oppure sommare la parte intera e quella decimale a parte, per poi ricombinare il tutto.
Un bacio !![]()
... puoi dare tutto in pasto a una funzione del tipo
function Around(number,X)
{
X = (!X ? 2 : X);
return Math.round(number*Math.pow(10,X))/Math.pow(10,X);
}
che esprime il numero number con X cifre decimali.
![]()
ma se io volessi solo la somma di due numeri decimali senza nessun arrotondamento?? la somma esatta?
Alla fine il computer serve solo a questo... è un calcolatore non per niente... ma se sbaglia i calcoli c'e' qualcosa di marcio alla base...
Anzitutto guardati questa discussione (ed eventualmente alcune delle discussioni ivi linkate)
http://forum.html.it/forum/showthrea...hreadid=341186
E` riportata anche nella discussione "in rilievo" in testa.
Ciao
Michele
Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
No domande tecniche in messaggi privati
fantastico... è normale! Bill Gates ha colpito ancora!!!!! Perchè nessun altro linguaggio al mondo commette lo stesso errore???????
:-D
Non e` questione di linguaggio. E tanto meno di sistema operativo. (questa volta [ma solo questa] Bill Gates non c'entra)
E` insito nel modo in cui i processori salvano i dati in virgola mobile, che la precisione dei dati sia finita.
Il problema e` che JS non procede ad un arrotondamento automatico dei dati in fase di stampa, cosa che succede con la maggior parte dei linguaggi moderni.
Comunque quasi 30 anni fa (Bill Gates ancora non sapeva programmare), quando seguivo i primi corsi di programmazione e ci veniva insegnato Fortran 4, ci dicevano che per arrotondare occorreva aggiungere 0.5 e troncare all'intero. Quello che in JS si farebbe:
val_intero = Math.floor(val_float + 0.5);
Come vedi le cose sono sempre le stesse. E le soluzioni pure.
Ciao
Michele
Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
No domande tecniche in messaggi privati
angykiss,
il risultato che ottieni contiene un errore di approssimazione che javascript purtroppo non provvede a correggere in automatico arrotondando per esempio ad un numero prestabilito di decimali quando effettui calcoli in virgola mobile.
Non sapendolo questo può essere causa di grossi problemi soprattutto in un linguaggio scarsamente tipizzato come javascript in cui tutti i numeri vengono gestiti alla stessa maniera nel formato IEEE a 8byte(64 bits) e in cui ti aspetti quindi di poter operare in modo immediato senza scherzi di questo tipo.
L'errore che si presenta ha l'ordine di grandezza del cosiddetto 'epsilon' (in parole semplici il più piccolo numero gestibile dal tuo PC) che puoi calcolare onthefly in questo modo:
<script>
//Find machine epsilon by Armageddon.
function eps(){
var n1=n2=1.0;
while(n1<n1+n2){n2/=2}
return n2*2;
}
alert(eps());
</script>
La soluzione per ora come ti è stato suggerito consiste nel ricordarti di arrotondare i numeri floating al desiderato numero di decimali se non vuoi ottenere risultati 'sporchi' dopo aver fatto operazioni matematiche.
Esempio:
<script>
//Round a number with desired decimals by Armageddon.
function fix(number,dec){
var n=(dec>=0)?Math.pow(10,dec):1e10;
return Math.round(number*n)/n;
}
var pippo=4.231;
var pluto=1.001;
alert('Not fixed = '+(pluto+pippo));
alert('Fixed = '+fix(pluto+pippo));
</script>
P.S: come verifica se provi ad aggiungere un paio di epsilon al risultato 'sporco' dovresti ottenere il risultato teorico atteso.
bye
armaged
eppure quando imparavamo assembler nessuno ci ha mai detto che il calcolatore sbaglia i calcoli
Ma dopo le precedenti spiegazioni continui a parlare di errore?
Ogni linguaggio ha delle proprie caratteristiche (altrimenti non ce ne sarebbero tanti), javascript ha puntato sulla non tipizzazione delle variabili, quindi gli interi li memorizza e tratta in virgola mobile. Ci sono numerosi vantaggi e quindi qualche svantaggio.
Un appunto lo si potrebbe fare sulla mancanza di una funzione che tronchi i valori dove vuoi tu, tipo la format del VB.
Non accaniamoci ciecamente sul povero Bill!
(leggasi come: ci sono così tante cose sulle quali accanirsi, lasciamolo stare dove non ha colpe.)
![]()
- "E' un messaggio. E' di Svarion, della terra di Merdor!"
- "Busto Arsizio?"
- "Terrazzo, sgabello, formaggio. Borraccia blu, ca**o di gomma e... CANNUCCIA!"
- "Ca**o dici? C'è scritto «frocio chi legge»!"