Frage

In JavaScript ist der typische Weg, um eine Zahl an n -Dezimalstellen zu runden, so etwas wie:

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}

console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));

Dieser Ansatz wird jedoch zu a runden maximal von n Dezimalstellen, während ich will stets Runde zu n Dezimalstellen. Zum Beispiel würde "2.0" auf "2" gerundet.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Das ist kein rundes Ploblem, das ist ein Display -Problem. Eine Zahl enthält keine Informationen zu erheblichen Ziffern. Der Wert 2 ist der gleiche wie 2.0000000000000. Wenn Sie den abgerundeten Wert in eine Zeichenfolge verwandeln, haben Sie eine bestimmte Anzahl von Ziffern angezeigt.

Sie könnten einfach Nullen nach der Nummer hinzufügen, so etwas wie:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';

(Beachten Sie, dass dies davon ausgeht, dass die regionalen Einstellungen des Clients den Zeitraum als Dezimaltrennzeichen verwenden, der Code benötigt mehr Arbeit, um für andere Einstellungen zu funktionieren.)

Andere Tipps

Ich denke, dass es einen einfacheren Ansatz für alle hier gibt und die Methode ist Number.toFixed() Bereits in JavaScript implementiert.

einfach schreiben:

var myNumber = 2;

myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"

etc...

Ich habe einen Weg gefunden. Dies ist Christophs Code mit einem Fix:

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}

Lesen Sie die Details der Wiederholung eines Zeichens mit einem Array -Konstruktor hier Wenn Sie neugierig sind, warum ich das "+ 1" hinzugefügt habe.

Es gibt immer eine bessere Möglichkeit, Dinge zu tun.

var number = 51.93999999999761;

Ich möchte vier Ziffern Präzision erhalten: 51.94

mach einfach:

number.toPrecision(4);

Das Ergebnis ist: 51.94

PHP-ähnliche Rundungsmethode

Der folgende Code kann verwendet werden, um Ihren eigenen Namespace, der einen Präzisionsparameter benötigt, Ihre eigene Version von Math zu fügen. Im Gegensatz zur Dezimalrunden im obigen Beispiel führt dies keine Konvertierung zu und von Strings durch, und der Präzisionsparameter funktioniert gleich wie PHP und Excel, wobei ein positiver 1 auf 1 Dezimalstelle und -1 zu den Zehns runden würde.

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230

aus Mozilla -Entwicklerreferenz für Math.Round ()

Hoffentlich arbeitete Code (machte nicht viel Test):

function toFixed(value, precision) {
    var precision = precision || 0,
        neg = value < 0,
        power = Math.pow(10, precision),
        value = Math.round(value * power),
        integral = String((neg ? Math.ceil : Math.floor)(value / power)),
        fraction = String((neg ? -value : value) % power),
        padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');

    return precision ? integral + '.' +  padding + fraction : integral;
}

Dies eignet sich zum Runden auf N -Ziffern (wenn Sie nur zu n -Ziffern abschneiden möchten, entfernen Sie die Mathematik.

function roundN(value, digits) {
   var tenToN = 10 ** digits;
   return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}

Musste in der Vergangenheit auf eine solche Logik in Java zurückgreifen Datenmanipulation E-Slate-Komponenten. Da ich herausgefunden hatte, dass das Hinzufügen von 0,1 zu 0 zu einem unerwartet langen Dezimalteil (dies liegt an schwimmenden Punktarithmetika).

Ein Benutzerkommentar bei Formatnummer, um immer 2 Dezimalstellen anzuzeigen nennt diese Technik Skalierung.

Einige erwähnen, dass es Fälle gibt, die nicht wie erwartet und bei http://www.jacklmoore.com/notes/round-in-javascript/ Dies wird stattdessen vorgeschlagen:

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}

Hier ist ein Link zu einem JavaScript Sprintf,

http://www.webtoolkit.info/javascript-sprintf.html

Ein Aufruf von Sprintf () ist eine Rundungsmethode in Perl, aber JavaScript hat diese Funktion nicht nativ.

http://perldoc.perl.org/functions/sprintf.html

Hilft das?

Ich denke, die folgende Funktion kann helfen

function roundOff(value,round) {
   return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}

Verwendungszweck : roundOff(600.23458,2); wird zurückkehren 600.23

Wenn Sie sich nicht wirklich für das Runding interessieren, fügte einfach ein tofixiertes (x) hinzu und entfernen Sie dann nach Bedarf den nachverfolgenden 0es und den Punkt. Es ist keine schnelle Lösung.

function format(value, decimals) {
    if (value) {
        value = value.toFixed(decimals);            
    } else {
        value = "0";
    }
    if (value.indexOf(".") < 0) { value += "."; }
    var dotIdx = value.indexOf(".");
    while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's

    return value;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top