Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    ARGH! Baco Javascript?!?!?

    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
    anija . è solo un blog
    www.anija.it

    «i'm a fountain of blood · in the shape of a girl»

  2. #2
    Reale_Augello
    Guest

    La...

    ... 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 !

  3. #3
    Reale_Augello
    Guest

    Oppure...

    ... 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.


  4. #4

    scusa...

    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...
    anija . è solo un blog
    www.anija.it

    «i'm a fountain of blood · in the shape of a girl»

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    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

  6. #6
    fantastico... è normale! Bill Gates ha colpito ancora!!!!! Perchè nessun altro linguaggio al mondo commette lo stesso errore???????
    :-D
    anija . è solo un blog
    www.anija.it

    «i'm a fountain of blood · in the shape of a girl»

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    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

  8. #8
    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

  9. #9
    eppure quando imparavamo assembler nessuno ci ha mai detto che il calcolatore sbaglia i calcoli
    anija . è solo un blog
    www.anija.it

    «i'm a fountain of blood · in the shape of a girl»

  10. #10
    Utente di HTML.it L'avatar di nuky
    Registrato dal
    Oct 2001
    Messaggi
    1,053
    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»!"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.