Rundungsproblem in Math.round() & .toFixed()

Lesezeit: 3 Minuten

Benutzer-Avatar
Surendra

Ich habe die folgenden zwei Methoden verwendet:

Number.prototype.myRound = function (decimalPlaces) {
    var multiplier = Math.pow(10, decimalPlaces);

    return (Math.round(this * multiplier) / multiplier);
};
alert((239.525).myRound(2));

Mathematisch wachsam sollte man sein 239.53 aber sein Geben 239.52 als Ausgabe. Also versuchte ich es mit .toFixed() Funktion & ich habe die richtige Antwort bekommen.

Aber wenn ich versuche, eine Antwort zu bekommen 239.575 es gibt wieder falsche ausgabe.

alert((239.575).toFixed(2));

Hier sollte Ausgabe sein 239.58 stattdessen sein Geben 239.57.

Dieser Fehler erzeugt einen geringfügigen Unterschied in der endgültigen Ausgabe. Also kann mir jemand helfen, das zu klären?

  • Interessant aber 239.375.toFixed(2) kehrt zurück "239.38" in Chrome 31 (Mac)… 🙂

    – Vision

    20. Dezember 2013 um 10:07 Uhr


  • mögliches Duplikat von Broken toFixed-Implementierung

    – Vision

    20. Dezember 2013 um 10:08 Uhr

  • @VisionN Nicht hier. Welchen Browser verwendest du? Ich bin auf dem neuesten FF auf Ubuntu.

    – Cédric Reichenbach

    20. Dezember 2013 um 10:10 Uhr

  • @CedricReichenbach Chrome 31 auf MacOS

    – Vision

    20. Dezember 2013 um 10:10 Uhr


  • Einfachere Lösung: Funktion zum Abschneiden auf Dezimalstellen

    – David

    25. Mai 2017 um 15:42 Uhr

Benutzer-Avatar
Kumod Singh

Diese Methode ergibt ein sehr korrektes rundes Ergebnis.

function RoundNum(num, length) { 
    var number = Math.round(num * Math.pow(10, length)) / Math.pow(10, length);
    return number;
}

Rufen Sie einfach diese Methode auf.

alert(RoundNum(192.168,2));

  • Es funktioniert gut. Es funktioniert für alle Bedingungen. Vielen Dank.

    – Surendra

    25. Dezember 2013 um 9:41 Uhr


  • Wie von TJ Crowder in stackoverflow.com/questions/10015027/… erwähnt, versuchen Sie RoundNum(35.855, 2). Eine bessere Antwort könnte das Dezimalrundungsbeispiel in sein developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – sie nennen Mesloth

    21. April 2014 um 19:15 Uhr


  • RoundNum(1.005,2) wird auf 1 gerundet, aber 1.01 erwartet

    – Ein Kunin

    23. Januar 2017 um 4:36 Uhr

Benutzer-Avatar
Niet the Dark Absol

Intern kann 239,575 nicht exakt dargestellt werden. Binär wäre 0,575 so etwas wie 1/2 + 1/16 + 1/128 + 1/256 + ….

Es ist einfach so, dass das Ergebnis binär dargestellt wird leicht weniger als 239.575. Deswegen, Math.round rundet ab.

Versuchen Sie Folgendes, um dies zu demonstrieren:

alert(239.575 - 239.5)

Sie würden erwarten, dass das Ergebnis 0,075 ist, aber stattdessen erhalten Sie 0,07499999999998863.

  • Obwohl es wahr ist, habe ich noch nie so etwas gesehen ‘Probleme’ in anderen Sprachen… Das ist definitiv das, was in JavaScript verbessert werden muss.

    – Vision

    20. Dezember 2013 um 10:17 Uhr

  • @VisioN Dies gilt für jede Sprache, die Gleitkommazahlen mit doppelter Genauigkeit verwendet. Das sind fast alle, außer denen mit Festkomma- oder beliebig genauen Systemen.

    – Niet the Dark Absol

    20. Dezember 2013 um 10:19 Uhr

Benutzer-Avatar
Srinath Mahé

Benutz einfach Math.round

function round(figureToRound){
    var roundOff = Math.round((figureToRound* 100 ).toFixed(2))/100;
    return roundOff;
}

console.log(round(1.005));

Dies hilft dem Rundungsproblem vollständig.

  • Funktioniert auf allen Fällen von mir. rund (239,575 – 239,5) 0,08 rund (239,575) 239,58 rund (239,525) 239,53 rund (1,005) 1,01

    – Googamanga

    27. Dezember 2017 um 16:58 Uhr


  • Funktioniert nicht für round(0.07499). Es gibt 0,08 statt 0,07 zurück

    – dugokontov

    28. Mai 2020 um 12:41 Uhr

round() wird den Trick tun. Versuchen Sie Folgendes:

var v= Math.round(239.575 * 100) / 100;
alert(v);

Arbeitsgeige

Benutzer-Avatar
Cédric Reichenbach

Das Problem ist wahrscheinlich die Ungenauigkeit des Fließkommas, daher können Sie in verschiedenen Fällen unterschiedliche Ergebnisse erhalten (unterschiedliche Erfassung einer Zahl, unterschiedliche Browser usw.).

Siehe auch: toFixed(2) rundet “x.525” inkonsistent?

Benutzer-Avatar
eisig

In meiner Software verwende ich diese:

(benötigen DecimalJS)

Number.prototype.toFixed = function(fixed) {
    return (new Decimal(Number(this))).toFixed(parseFloat(fixed) || 
0);
};


var x = 1.005;
console.log( x.toFixed(2) ); //1.01

function bestRound(val, decimals){
    decimals = decimals || 2;
    var multiplier = Math.pow(10, decimals)
    return Math.round((val * multiplier ).toFixed(decimals)) / multiplier;
  }

bestRound(239.575 - 239.5)   0.08
bestRound(239.575)         239.58
bestRound(239.525)         239.53
bestRound(1.005)             1.01

1019340cookie-checkRundungsproblem in Math.round() & .toFixed()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy