wake-up-neo.com

Javascript: Formatieren einer gerundeten Zahl in N Dezimalzahlen

in JavaScript ist die typische Art, eine Zahl auf N Dezimalstellen zu runden, etwa so:

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

Dieser Ansatz wird jedoch auf ein Maximum von N Dezimalstellen aufrunden, während ich immer auf N Dezimalstellen runden möchte. Zum Beispiel würde "2.0" auf "2" gerundet werden. 

Irgendwelche Ideen?

88
hoju

Das ist kein Rundungsproblem, das ist ein Anzeigeproblem. Eine Zahl enthält keine Informationen zu signifikanten Ziffern. Der Wert 2 ist derselbe wie 2.0000000000000. Wenn Sie den abgerundeten Wert in eine Zeichenfolge umwandeln, wird eine bestimmte Anzahl von Ziffern angezeigt.

Sie können nach der Zahl einfach Nullen hinzufügen, etwa:

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

(Beachten Sie, dass davon ausgegangen wird, dass die regionalen Einstellungen des Clients den Zeitraum als Dezimaltrennzeichen verwenden. Der Code erfordert jedoch mehr Arbeit, um für andere Einstellungen zu funktionieren.)

20
Guffa

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

einfach schreiben:

var myNumber = 2;

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

usw...

215
David

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 zum Wiederholen eines Zeichens mit einem Array-Konstruktor hier , wenn Sie wissen möchten, warum ich "+ 1" hinzugefügt habe.

47
Elias Zamaria

Es gibt immer einen besseren Weg, Dinge zu tun.

var number = 51.93999999999761;

Ich möchte eine vierstellige Genauigkeit: 51,94

mach einfach:

number.toPrecision(4);

das Ergebnis wird sein: 51,94

15
de.la.ru

PHP-ähnliche Rundungsmethode

Mit dem folgenden Code können Sie Ihre eigene Version von Math.round zu Ihrem eigenen Namespace hinzufügen, für den ein Präzisionsparameter erforderlich ist. Im Gegensatz zur Dezimalrundung im obigen Beispiel werden keine Konvertierungen in und aus Zeichenfolgen durchgeführt. Der Parameter precision arbeitet genauso wie PHP und Excel, wobei eine positive 1 auf eine Dezimalstelle gerundet und -1 auf eine Zehnerstelle gerundet wird .

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

von Mozilla-Entwicklerreferenz für Math.round ()

5
JohnnyBizzle

Hoffentlich funktionierender Code (nicht viel getestet):

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;
}
2
Christoph

Dies funktioniert für das Runden auf N Ziffern (wenn Sie nur auf N Ziffern kürzen möchten, entfernen Sie den Math.round-Aufruf und verwenden Sie den Math.trunc-Aufruf):

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

Musste in der Vergangenheit bei Java auf eine solche Logik zurückgreifen, als ich Datenmanipulation von E-Slate-Komponenten schrieb. Das liegt daran, dass ich herausgefunden habe, dass das Hinzufügen von 0,1 zu 0 zu einem unerwartet langen Dezimalteil führt (dies ist auf Gleitkomma-Arithmetik zurückzuführen).

Ein Benutzerkommentar bei Formatnummer, um immer 2 Dezimalstellen anzuzeigen ruft diese Technik auf.

Einige erwähnen, dass es Fälle gibt, die nicht wie erwartet gerundet werden, und unter http://www.jacklmoore.com/notes/rounding-in-javascript/ wird dies stattdessen vorgeschlagen:

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

Ich denke unter 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));
}

verwendung: roundOff(600.23458,2); gibt 600.23 zurück

0
KRISHNA TEJA

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

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

Hilft das?

0
Paul