2012-05-30 5 views
6

Ich bin sehr neu in HTML, Javascript und CSS, also bitte vergeben, wenn meine Frage für Sie idiotisch klingt. Meine Frage ist, wie kann ich verhindern, dass die Funktion die Dezimalzahl aufrundet.Javascript - Wie zu verhindernFixed von Abrundungen von Dezimalzahlen

Hier ist mein Link: http://jsfiddle.net/RWBaA/4/

Was ich versuche die Eingabe Ich überprüfe, ob ihre zu tun, ist eine gültige Dezimalzahl, wenn der Benutzer in das Textfeld ein. Gleichzeitig möchte ich auch überprüfen, ob die Eingabe eine gültige Währung ist, was bedeutet, dass nur zwei weitere Zahlen rechts vom Dezimalpunkt hinzugefügt werden können. Das Problem ist, wenn der Benutzer die dritte Zahl nach dem Komma gibt die zweite Zahl nach dem Komma wird auf die nächsten Hundertstel abgerundet, wenn die die dritte Zahl> = 5.

Testeingang:

 
    Input   Output 
123456.781 -> 123456.78 

123456.786 -> 123456.79 

Warum erlaubt mein Code keine Pfeiltasten in Chrom?

Bitte helfen. Wenn Sie eine bessere Lösung haben, können Sie dies vorschlagen. Danke im Voraus.

Antwort

10

Rund um die Zahl (nach unten) auf den nächsten Cent zuerst:

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

EDIT Es darauf hingewiesen worden ist, dass dies für beispielsweise versagt 1.13. Ich hätte es besser selbst wissen sollen! Diese

schlägt fehl, da die interne Fließpunktdarstellung von 1,13 sehr leicht weniger als 1,13 - Multiplikation, dass 100 nicht 113, sondern 112,99999999999998578915 produziert und dann nach unten Rundung dauert es bis 1.12

Nachdem die neu zu lesen Frage: Es scheint, dass Sie wirklich nur versuchen, eine Eingabevalidierung durchzuführen (siehe unten). In diesem Fall sollten Sie normale Formularvalidierungstechniken verwenden und Sie sollten .toFixed() überhaupt nicht verwenden. Diese Funktion ist für präsentiert Zahlen, nicht mit ihnen zu berechnen.

$('#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;'? Dies ist nicht c/C++ – qwertymk

+0

Vielen Dank, es löste mein Problem ... Aber warte ... Warum kann ich nicht die Pfeiltasten in Google Chrome verwenden? Es funktioniert gut in Firefox. – TheOnlyIdiot

+3

@qwertymk alte Gewohnheiten sterben hart ... und es war 1:30 Uhr ... – Alnitak

4

Zusätzlich zu verhindern toFixed() von Dezimalzahlen Abrundung und Ihre Zahl in zwei Dezimalstellen machen Sie diese nutzen können,

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

Sie diesem einen Versuch geben kann, es gewann‘ t runden Ihre Dezimalzahlen

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

Ihre Funktion ist in Ordnung für mich! https://jsfiddle.net/lmcdevloper/gcgyxv46/ Vielen Dank! – lmcDevloper

0

wenn Sie runden vermeiden off ... Ex. 1,669 => 1,67, 548,466 => 548,47

Das Ergebnis der Funktion wie folgt aussieht: 1,669 => 1,66, 548,466 => 548,46

Dann wurde die folgende JQuery-Funktion wird Ihnen helfen. Es ist getestet und funktioniert ordnungsgemäß.

<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

Das ist noch einfacher:

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

So:

truncateToDecimals(123456.786) -> 123456.78 
Verwandte Themen