Visualizzazione dei risultati da 1 a 7 su 7

Discussione: math errors

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    26

    math errors

    Ciao a tutti

    Problema : certe operazioni matematiche in js risultano errate.

    ad esempio l'operazione (10.1/0.1)

    risulta 100.99999999999999 invece che 101.

    A me serve un risultato perfetto almeno alla seconda cifra decimale, ma devo arrivarci senza fare arrotondamenti.

    Qualcuno conosce una classe che funziona meglio della Math di js o ha cmq in mente una soluzione funzionale?

    Grazie a tutti e ciao!

  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998

    Re: math errors

    Originariamente inviato da MARagorn
    ma devo arrivarci senza fare arrotondamenti.
    Per fare le frittate devi rompere le uova

    ciao
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  3. #3

    Re: math errors

    Originariamente inviato da MARagorn
    Qualcuno conosce una classe che funziona meglio della Math di js o ha cmq in mente una soluzione funzionale?
    essendo lo scarto prevedibile, un .toFixed(2) dovrebbe garantire il risultato che cerchi.

    Va sottolineato che fa tanto fico dire JavaScript ha math inconsistente, quando il problema è stranoto da sempre in quasi tutti i linguaggi di programmazione ... ed il problema è alla radice, alla root del binario, quindi usa toFixed o passa per un linguaggio server specializzato o creato appositamente per aritmetica
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    26
    Capito.

    Mettiamola così: su un sito in php+js ho necessità di poter inserire dentro un form una input text libera con dei valori numerici con precisione alla seconda cifra decimale, e range compreso tra nummin e nummax, specificando un passo (nel caso specifico 0.1).

    quello che facevo io era prendere il campo inserito dall'utente, controllare che fosse nel range e che il passo fosse giusto, ricorrendo al modulo aritmetico, valore%passo. Se il risultato (cioè il resto) è 0 allora significa che il valore inserito è corretto. Dovendo valutare il resto di una divisione, nella pratica, non posso arrotondare con toString il numero alla seconda cifra decimale, altrimenti mi ritroverei tutti falsi positivi.

    Il sistema ha funzionato correttamente fino a casi con passo 0.50 (esempio con valore inserito dall'utente 8.25: 8.25%0.50=0) e 0.25, e ha cominciato a creare problemi con il 0.1.

    Qualche suggerimento, anche di approccio differente per fare quel che mi serve?

  5. #5
    Originariamente inviato da MARagorn
    Qualche suggerimento, anche di approccio differente per fare quel che mi serve?
    sei fortunato perchè hai il passo predefinito quindi risulta facile creare una semplice funzione specifica capace di risolverti il problema
    codice:
    function mod(num, mod){
        var pow = Math.pow(10, (("" + mod).split(".")[1] || "").length);
        return ((num * pow) % (mod * pow)) / pow;
    };
    
    // esempio
    mod(8.25, .1); // 0.05
    mod(8.25, .05); // 0
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    26
    Se non ho capito male la tua funzione crea 1, 10 o 100 da moltiplicare nell'operazione di modulo, in modo da togliere i decimali e farli diventare decine e unità e da bypassare il baco sul calcolo dei numeri con decimali.

    Non ci avevo minimamente pensato, è semplice

    Grazie mille per l'aiuto

  7. #7
    Originariamente inviato da MARagorn
    Non ci avevo minimamente pensato, è semplice
    unico limite è sui grandi numeri, da Math.pow(2, 32) in su, poichè la matematica a quel punto è un'opinione, non garantita, anche per php, dato che sei fuori il range dell'integer signed a 32 bit

    ma se lavori con quei numeri sei ricco e quindi non ti poni il problema, pagherai altri per risolverlo
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

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 © 2025 vBulletin Solutions, Inc. All rights reserved.