2012-05-30 33 views
6

Sono molto nuovo per html, javascript e css quindi ti prego di perdonare se la mia domanda suona idiota per te. La mia domanda è come posso impedire alla funzione toFixed() di arrotondare il numero decimale.javascript - come impedire a Fixed di arrotondare i numeri decimali

Ecco il mio link: http://jsfiddle.net/RWBaA/4/

Quello che sto cercando di fare è Sto controllando l'ingresso se un numero decimale valido ogni volta che l'utente digita nella casella di testo. Allo stesso tempo, voglio anche verificare se l'input è una valuta valida, il che significa che è possibile aggiungere solo altri due numeri alla destra del punto decimale. Il problema è quando l'utente entra nel terzo numero dopo la virgola il secondo numero dopo la virgola è arrotondato al centesimo più vicino se il 3 ° numero è Input> = 5.

prova:

 
    Input   Output 
123456.781 -> 123456.78 

123456.786 -> 123456.79 

Perché il mio codice non consente i tasti freccia in chrome?

Per favore aiuto. Se hai una soluzione migliore, sei libero di suggerire. Grazie in anticipo.

risposta

10

rotondo il numero (giù) al centesimo primo:

val = Math.floor(100 * val)/100; 

EDIT E 'stato rilevato che non è così per esempio 1.13. Avrei dovuto conoscere meglio me stesso!

Questo fallisce perché rappresentazione virgola mobile interno di 1,13 è leggermente inferiore a 1.13 - moltiplicando tale da 100 non produce 113 ma 112,99999999999998578915 e poi arrotondamento che stabilisce prende a 1,12

Avendo rileggere il domanda, sembra che tu stia davvero solo cercando di eseguire la convalida dell'input (vedi sotto), nel qual caso dovresti usare le normali tecniche di validazione del modulo e non dovresti usare affatto .toFixed(). Questa funzione è per che presenta i numeri, non calcola con essi.

$('#txtAmount').on('keypress', function (e) { 
    var k = String.fromCharCode(e.charCode); 
    var v = this.value; 
    var dp = v.indexOf('.'); 

    // reject illegal chars 
    if ((k < '0' || k > '9') && k !== '.') return false; 

    // reject any input that takes the length 
    // two or more beyond the decimal point 
    if (dp >= 0 && v.length > dp + 2) { 
     return false; 
    } 

    // don't accept >1 decimal point, or as first char 
    if (k === '.' && (dp >= 0 || v.length === 0)) { 
     return false; 
    } 
}); 
+0

'/ 100.0;'? Questo non è c/C++ – qwertymk

+0

Grazie mille ha risolto il mio problema ... Ma aspetta ... Perché non posso usare i tasti freccia in google chrome? Funziona bene in Firefox. – TheOnlyIdiot

+3

@qwertymk le vecchie abitudini sono dure a morire ... ed era l'1:30 del mattino ... – Alnitak

4

Inoltre, per evitare toFixed() da arrotondamento numeri decimali e per rendere il vostro numero in due cifre decimali che è possibile utilizzare questo,

val = (Math.floor(100 * val)/100).toFixed(2); 
2

si può dare a questo una prova, ha vinto' t round your decimals

var toFixed = function(val, decimals) { 
    var arr = ("" + val).split(".") 
    if(arr.length === 1) 
    return val 
    var int = arr[0], 
     dec = arr[1], 
     max = dec.length - 1 
    return decimals === 0 ? int : 
    [int,".",dec.substr(0, decimals > max ? max : decimals)].join("") 
} 
+0

La tua funzione è ok per me! https://jsfiddle.net/lmcdevloper/gcgyxv46/ Grazie! – lmcDevloper

0

se si desidera evitare l'arrotondamento ... Es. 1.669 => 1.67, 548,466 => 548,47

Il risultato della funzione appare come segue: 1.669 => 1,66, 548,466 => 548,46

Poi la seguente funzione JQuery vi aiuterà. È testato e funziona correttamente.

<input name="a" type="text" id="a" size="7%" tabindex="2"> 




    $('#a').keyup(function(e){ 
     if($(this).val().indexOf('.')!=-1){ 
      if($(this).val()=="." && $(this).val().length==1){ 
       this.value = parseFloat(0).toFixed(1); 
      }else if($(this).val().split(".")[1].length > 2){     
       if(isNaN(parseFloat(this.value))) 
        return; 
        this.value = $(this).val().split(".")[0]+"."+$(this).val().split(".")[1].substring(0,2); 
      } 
     } 
    }); 
1

Questo è ancora più semplice:

function truncateToDecimals(num, dec = 2) { 
    const calcDec = Math.pow(10, dec); 
    return Math.trunc(num * calcDec)/calcDec; 
} 

Quindi:

truncateToDecimals(123456.786) -> 123456.78 
Problemi correlati