Округление до двух знаков после запятой - не найти правильную формулу

Кажется, я не могу найти правильную формулу для двух знаков после запятой в моем коде. Прямо сейчас он округляется до трех знаков после запятой, когда я нажимаю на первый вариант в отношении вычислений (не то чтобы 3 знака после запятой что-то значат. Но независимо от результата он должен округляться до 2 знаков после запятой). Это моя последняя попытка:

$('#a_is_valid').one('click', function(){
    if ($('#code_promo').val() == 'promocode')
        {$('#gtotal').val($('#gtotal').val()-($('#gtotal').val()-        
            (($('#gtotal').val()*.75)))).fixed(2);

    }
})

person Kung Fu Front Ender    schedule 25.11.2013    source источник
comment
jQuery не имеет встроенного метода .fixed(), и кажется, что Google показывает, что плагины, использующие этот метод, предназначены для позиционирования элементов на странице, а не для указания десятичной точки (математика).   -  person Crayon Violent    schedule 25.11.2013
comment
Я не знаю об этом, потому что без него я получаю 39 вместо 39,00.   -  person Kung Fu Front Ender    schedule 25.11.2013


Ответы (1)


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

var number;
var output = (Math.round(number * 100) / 100).toFixed(2);

В вашем случае, похоже, вы хотите:

$('#a_is_valid').one('click', function(){
     if ($('#code_promo').val() == 'promocode')
        {$('#gtotal').val((Math.round($('#gtotal').val() * 75) / 100).toFixed(2));

Math.round (достаточно правильно) округляет до ближайшего целого числа, поэтому вам придется немного поколдовать. Умножьте на 10 ^ (количество знаков после запятой, которое вы хотите) - в вашем случае 10 ^ 2 или 100, округлите, а затем разделите на то же число.

В примере, который я сделал специально для вас, вы заметите, что я умножаю на 75: 0,75 * 100.

Возможно, проще всего увидеть это с помощью функции:

function roundToNPlaces(n, val) {
    var multiplier = Math.pow(10, n);
    return (Math.round(val * multiplier) / multiplier).toFixed(n);
}

Затем вы можете просто установить gtotal следующим образом:

$('#gtotal').val(roundToNPlaces(2, $('gtotal').val() * 0.75));

См. этот FIDDLE.

Видеть:

  • Math.round ПРИМЕЧАНИЕ. В этой документации представлена ​​реализация, аналогичная (но более сложная) коду, который я дал. Если вы скопируете весь их пример Decimal rounding в свой код (до того, как вам понадобится его использовать в первый раз), вы можете просто использовать Math.round10($('#gtotal').val() * .75, -2);. См. http://jsfiddle.net/aW44n/1/.
  • исправлено
person Scott Mermelstein    schedule 25.11.2013
comment
Это прекрасно работает. Хотя вместо округления до 38,81 (из-за 38,805) округляется до 39,00. Я думал, что math.round будет округлять два десятичных знака, не округляя все это? - person Kung Fu Front Ender; 25.11.2013
comment
@KungFuFrontEnder А. Я не думал об этом. Подождите, позвольте мне внести правку. - person Scott Mermelstein; 25.11.2013
comment
@KungFuFrontEnder Посмотрите мою правку, это должно быть то, что вам нужно. - person Scott Mermelstein; 25.11.2013
comment
Потрясающая редакция. Я спасу того! :D Я сделал эту математику некоторое время назад, и это заняло у меня целую вечность, лол. Клянусь, использование JS в таком виде для расчетов может сломать спину. Престижность как за редактирование, так и за дополнительное объяснение, Скотт. Хорошо объяснил :) Спасибо за ссылки. Кстати, math.round10 действительно должен работать по этой ссылке? Я пробовал это раньше, но это сломало бы код. - person Kung Fu Front Ender; 25.11.2013
comment
@KungFuFrontEnder Вам нужно будет скопировать весь второй пример из MDN и поместить его как скрипт на свою страницу, прежде чем вызывать его, но тогда да, вы сможете сделать Math.round10(38.805, -2). Проверьте - person Scott Mermelstein; 26.11.2013