математика javascript, округление до двух знаков после запятой с шагом .05 - PullRequest
1 голос
/ 22 сентября 2011

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

$('.addsurcharge').click(function() {               
    $('span.depositamount').text(function(i,v) {
        return Math.round(parseInt(v * 100, 10) * 0.025) / 100 + (v * 1);
    });      
});

$('.nosurcharge').click(function() {            
    $('span.depositamount').text(function(i,v) {
        return Math.round(parseInt(v * 100, 10) * -0.025) / 100 + (v * 1);
    });      
});

По сути, вышеизложенное добавляет (или вычитает) надбавку 2,5% для депозитов AMEX, и я хочу, чтобы она округлялась до ближайших двух десятичных значений. Желательно с шагом 0,05.

Помощь оценена!

Ответы [ 5 ]

1 голос
/ 16 октября 2014

Хотя пост немного устарел, вопрос не в этом.Я думаю, что плакат имел в виду, что некоторая валюта рассчитывается с центами, но цены указаны в х.00 или х.05 центов.Например, швейцарская валюта.

Решение, заимствованное из ответа Роба с небольшим исправлением:

function roundToFiveCents(v) {
    var len;
    // Format to 2 numbers after decimal point an turn dollars into cents
    v = v.toFixed(2) * 100;

    // Get residual cents
    var r = v % 5;

    // Round to 5c
    if (r) {
        v -= (r === 1 || r === 2) ? r : r - 5;
    }

    // Convert to string
    v = v + '';
    len = v.length - 2;

    // Return formatted string
    return v.substring(0, len) + '.' + v.substring(len);
}
1 голос
/ 22 сентября 2011

Если ваш вопрос «Как мне взять v, переменную, которая содержит сумму в долларах и центах, и применить надбавку AMEX в размере 2,5% с результатом, округленным до ближайшего цента (то есть до двух десятичных знаков) ?» Тогда вы можете попробовать это:

return (v * 1.025).toFixed(2);

Если у вас есть переменная доплата, попробуйте это:

var surcharge = 0.025; // or whatever percentage applies

return (v * (1 + surchage)).toFixed(2);

Обратите внимание, что toFixed возвращает строковое представление, но выполняет округление за вас.

(Что касается вашей функции «nosurcharge», вы не можете удалить доплату 0,025, которая была применена ранее, умножением на -0,025. Вы применяете доплату, умножая на 1,025, поэтому вы удаляете ее делением на 1,025.)

1 голос
/ 22 сентября 2011

Самый простой способ для валюты - это работать в младших единицах, затем округлять и конвертировать в основные единицы только в конце.Таким образом, для системы с долларами и центами работайте в центах до конца, а затем конвертируйте в доллары.Если текст для ввода имеет формат «2.03», то он может округлить его до ближайших 0,05 доллара, используя что-то вроде:

function roundToFiveCents(v) {

  // Turn dollars into cents and convert to number
  var len;
  v = v * 100;

  // Get residual cents
  var r = v % 5;

  // Round to 5c
  if (r) {
    v -= (r == 1 || r == 2)? r : r-5;
  }

  // Convert to string
  v = v + '';
  len = v.length - 2;

  // Return formatted string
  return v.substring(0, len) + '.' + v.substring(len);
}

Это может быть более кратким, но я не вижу смысла, это будет только сервер, чтобы запутать.Манипулирование строками очень быстро и заменяет неопределенность умножения JavaScript и деления десятичных дробей простым сложением и вычитанием.

например, заимствование из ответа rfausak:

// Returns string, remove ' + ''' to return number
function roundToFiveCents(v) {
  return (Math.round(v*20)/20).toFixed(2) + '';
}
0 голосов
/ 27 февраля 2014
var n = 8.22354;
roundx(n, 3)

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

Эта простая функция хорошо подходит для округления до x количества мест.

0 голосов
/ 22 сентября 2011

Как насчет следующего JavaScript:

function my_round(x) {
    x *= 20;
    x = Math.ceil(x);
    return x / 20;
}
var amount = 3.37;
alert(my_round(amount));
...