Javascript: formatowanie zaokrąglonej liczby do n miejsc dziesiętnych

W JavaScript typowym sposobem zaokrąglania liczby do N miejsc po przecinku jest coś w stylu:

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

Jednak to podejście będzie zaokrąglać maksymalnie Z N miejsc po przecinku, podczas gdy ja chcę Zawsze zaokrąglać do N miejsc po przecinku. Na przykład "2.0 "będzie zaokrąglone do"2".

Jakieś pomysły?
Author: Frosty Z, 2010-02-08

9 answers

To nie jest zaokrąglanie ploblem, to jest problem z wyświetlaniem. Liczba nie zawiera informacji o cyfrach znaczących; wartość 2 jest taka sama jak 2.0000000000000. To, gdy zmienisz zaokrągloną wartość w ciąg znaków, który sprawi, że wyświetli określoną liczbę cyfr.

Możesz po prostu dodać zera po liczbie, coś w stylu:

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

(Należy zauważyć, że zakłada się, że ustawienia regionalne klienta używają kropki jako separatora dziesiętnego, kod wymaga więcej pracy aby działać dla innych ustawień.)

 20
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 11:33:44

Myślę, że istnieje bardziej proste podejście do wszystkich podanych tutaj, a Metoda Number.toFixed() jest już zaimplementowana w JavaScript.

Po prostu napisz:

var myNumber = 2;

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

Itd...

 205
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-05 14:38:05

Znalazłem sposób. Jest to kod Christopha z poprawką:

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

Przeczytaj szczegóły powtarzania znaku za pomocą konstruktora tablicy tutaj jeśli jesteś ciekawy, dlaczego dodałem "+ 1".

 47
Author: Elias Zamaria,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:35

Zawsze jest lepszy sposób na robienie rzeczy.

var number = 51.93999999999761;

Chciałbym dostać cztery cyfry precyzja: 51.94

Po prostu zrób:

number.toPrecision(4);

Wynik będzie: 51.94

 13
Author: de.la.ru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-12 08:31:22

PHP-jak metoda zaokrąglania

Poniższy kod może być użyty do dodania własnej wersji matematyki.round to your own namespace which take a precision parameter. W przeciwieństwie do zaokrąglania dziesiętnego w powyższym przykładzie, nie wykonuje to konwersji do i z łańcuchów, a parametr precyzji działa tak samo jak PHP i Excel, gdzie dodatnie 1 zaokrąglałoby się do 1 miejsca po przecinku, a -1 zaokrąglałoby do dziesiątek.

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

From Mozilla Developer reference for Math.Runda()

 5
Author: JohnnyBizzle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 01:18:26

Mam nadzieję, że działający kod (nie zrobił zbyt wiele testów):

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
Author: Christoph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-27 14:31:28

Oto link do Javascript sprintf,

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

Wywołanie sprintf () jest jedną z metod zaokrąglania w Perlu, ale javascript nie posiada tej funkcji natywnie.

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

Czy to pomaga?

 0
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-08 11:29:38

Myślę, że poniżej funkcja może pomóc

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));
}

Użycie: roundOff(600.23458,2); zwróci 600.23

 0
Author: KRISHNA TEJA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 20:35:13

Jeśli nie zależy ci na zaokrąglaniu, po prostu dodaj toFixed (x), a następnie usuń końcowe 0es i kropkę, jeśli to konieczne. Nie jest to szybkie rozwiązanie.

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;
}
 -2
Author: Juan Carrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-13 14:52:43