JavaScript математика, округлить до двух десятичных знаков [дубликат]

«Но я не уверен, что он подразумевает, выполнив мою собственную версию TextView?»

Он означает, что вы можете расширить класс android.widget.TextView (или Canvas или какой-либо другой визуализируемой поверхности) и реализовать свою собственную переопределяющую версию, которая позволяет встроенным изображениям с текстом, текущим вокруг них.

Это может быть довольно много работы в зависимости от того, насколько вы это делаете.

373
задан K48 1 November 2018 в 03:28
поделиться

13 ответов

ПРИМЕЧАНИЕ. - См. Редактирование 4, если важна трехзначная точность.

var discount = (price / listprice).toFixed(2);

toFixed будет округлять вас вверх или вниз в зависимости от значений, превышающих 2 знака после запятой.

Пример: http://jsfiddle.net/calder12/tv9HY/

Документация: https://developer.mozilla.org/en-US/docs/ Web / JavaScript / Reference / Global_Objects / Number / toFixed

Редактировать - Как упоминалось другими, это преобразует результат в строку. Чтобы избежать этого:

var discount = +((price / listprice).toFixed(2));

Редактировать 2 - Как также упоминалось в комментариях, эта функция не работает с некоторой точностью, например, в случае 1,005 она вернет 1,00 вместо 1,01. Если важна точность в этой степени, я нашел ответ: https://stackoverflow.com/a/32605063/1726511 Кажется, что он хорошо работает со всеми тестами, которые я пробовал.

Однако требуется одно небольшое изменение: функция в ответе, связанном выше, возвращает целые числа, когда округляет до единицы, поэтому, например, 99.004 вернет 99 вместо 99.00, что не идеально для отображения цен.

Редактировать 3 - Похоже, что toFixed на фактическом возврате все еще испортил некоторые числа, это окончательное редактирование работает. Черт возьми, так много переделок!

   var discount = roundTo((price / listprice), 2);

   function roundTo(n, digits) {
     if (digits === undefined) {
       digits = 0;
     }

     var multiplicator = Math.pow(10, digits);
     n = parseFloat((n * multiplicator).toFixed(11));
     var test =(Math.round(n) / multiplicator);
     return +(test.toFixed(digits));
   }

См. Пример Fiddle здесь: https://jsfiddle.net/calder12/3Lbhfy5s/

Редактировать 4 - Вы, ребята, убиваете меня. Редактировать 3 не удается на отрицательных числах, не разбираясь в том, почему просто проще справиться с превращением отрицательного числа в положительное, прежде чем выполнять округление, а затем повернуть его обратно, прежде чем вернуть результат.

function roundTo(n, digits) {
    var negative = false;
    if (digits === undefined) {
        digits = 0;
    }
        if( n < 0) {
        negative = true;
      n = n * -1;
    }
    var multiplicator = Math.pow(10, digits);
    n = parseFloat((n * multiplicator).toFixed(11));
    n = (Math.round(n) / multiplicator).toFixed(2);
    if( negative ) {    
        n = (n * -1).toFixed(2);
    }
    return n;
}

Скрипка: https://jsfiddle.net/3Lbhfy5s/79/

709
ответ дан Rick Calder 1 November 2018 в 03:28
поделиться

Если вы используете унарный плюс для преобразования строки в число , как описано в MDN .

Например: +discount.toFixed(2)

122
ответ дан Alexis Tyler 1 November 2018 в 03:28
поделиться

Чтобы получить результат с двумя десятичными знаками, вы можете сделать это следующим образом:

var discount = Math.round((100 - (price / listprice) * 100) * 100) / 100;

Округляемое значение умножается на 100, чтобы сохранить первые две цифры, затем мы делим на 100, чтобы получить фактический результат.

29
ответ дан Cattode 1 November 2018 в 03:28
поделиться

Лучшее и простое решение, которое я нашел, это

function round(value, decimals) {
 return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}   
round(1.005, 2); // 1.01
14
ответ дан Naga Srinu Kapusetti 1 November 2018 в 03:28
поделиться

Я думаю, что лучший способ, которым я видел, это умножить на 10 на степень числа цифр, затем сделать Math.round, затем, наконец, разделить на 10 на степень цифры. Вот простая функция, которую я использую в машинописи:

function roundToXDigits(value: number, digits: number) {
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}

Или простой javascript:

function roundToXDigits(value, digits) {
    if(!digits){
        digits = 2;
    }
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}
10
ответ дан Bryce 1 November 2018 в 03:28
поделиться

попробуйте использовать discount.toFixed(2);

14
ответ дан Gonzalo.- 1 November 2018 в 03:28
поделиться

Самый быстрый путь - быстрее, чем исправлено ():

ДВА ПОПРАВКИ

x      = .123456
result = Math.round(x * 100) / 100  // result .12
<час>

ТРИ ПОПРАВКИ

x      = .123456
result = Math.round(x * 1000) / 1000      // result .123
6
ответ дан Kamy D 1 November 2018 в 03:28
поделиться
    function round(num,dec)
    {
      num = Math.round(num+'e'+dec)
      return Number(num+'e-'+dec)
    }
      //Round to a decimal of your choosing:
    round(1.3453,2)
2
ответ дан Chris Martin 1 November 2018 в 03:28
поделиться

Функции Math.round () и .toFixed () предназначены для округления до ближайшего целого числа. Вы получите неверные результаты при работе с десятичными знаками и использовании метода «умножить и разделить» для Math.round () или параметра для .toFixed (). Например, если вы попытаетесь округлить 1,005, используя Math.round (1.005 * 100) / 100, вы получите результат 1, а 1,00 - .toFixed (2) вместо того, чтобы получить правильный ответ 1,01.

Вы можете использовать следующее для решения этой проблемы:

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2');

Добавьте .toFixed (2), чтобы получить два десятичных знака, которые вы хотели.

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2').toFixed(2);

Вы можете создать функцию, которая будет обрабатывать округление для вас:

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

Пример: https://jsfiddle.net/k5tpq3pd/36/

Альтернатива

Вы можете добавить функцию округления к числу, используя прототип. Я бы не советовал добавлять здесь .toFixed (), так как он возвращает строку вместо числа.

Number.prototype.round = function(decimals) {
    return Number((Math.round(this + "e" + decimals)  + "e-" + decimals));
}

и используйте его так:

var numberToRound = 100 - (price / listprice) * 100;
numberToRound.round(2);
numberToRound.round(2).toFixed(2); //Converts it to string with two decimals

Пример https://jsfiddle.net/k5tpq3pd/35/

Источник: http://www.jacklmoore.com/notes/rounding-in-javascript/

42
ответ дан Arne H. Bitubekk 1 November 2018 в 03:28
поделиться

Для обработки округления до любого количества десятичных разрядов для большинства нужд будет достаточно функции с двумя строками кода. Вот пример кода для игры.



    var testNum = 134.9567654;
    var decPl = 2;
    var testRes = roundDec(testNum,decPl);  
    alert (testNum + ' rounded to ' + decPl + ' decimal places is ' + testRes);

    function roundDec(nbr,dec_places){
        var mult = Math.pow(10,dec_places);
        return Math.round(nbr * mult) / mult;
    }

0
ответ дан user3232196 1 November 2018 в 03:28
поделиться

Небольшое отклонение от принятого ответа. toFixed(2) возвращает строку, и вы всегда получите два десятичных знака. Это могут быть нули. Если вы хотите подавить последние нули, просто сделайте это:

var discount = + ((price / listprice).toFixed(2));

Отредактировано: я только что обнаружил ошибку в Firefox 35.0.1, что означает, что приведенное выше может дать NaN с некоторыми значениями.
Я изменил свой код на

var discount = Math.round(price / listprice * 100) / 100;

Это дает число с точностью до двух десятичных знаков. Если бы вы хотели три, вы бы умножили и поделили на 1000 и т. Д.
ОП всегда хочет два знака после запятой, но если toFixed () не работает в Firefox, он должен сначала исправить.
См. https://bugzilla.mozilla.org/show_bug.cgi?id=1134388

.
7
ответ дан HalfTitle 1 November 2018 в 03:28
поделиться

Вот рабочий пример

var value=200.2365455;
result=Math.round(value*100)/100    //result will be 200.24
-1
ответ дан Rodgers Kilonzo 1 November 2018 в 03:28
поделиться

function discoverOriginalPrice(discountedPrice, salePercentage) {
  var originalPrice = discountedPrice / (1 - (salePercentage * .01));
  return +originalPrice.toFixed(2);
}
0
ответ дан James Kip 1 November 2018 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: