2012-05-02 3 views
6

Вопрос
Кто-нибудь знает способ округления поплавка до ближайшего 0,05 в JavaScript?Округление до ближайшего 0.05 в JavaScript

Пример

BEFORE | AFTER 
    2.51 | 2.55 
    2.50 | 2.50 
    2.56 | 2.60 

Текущий код

var _ceil = Math.ceil; 
Math.ceil = function(number, decimals){ 
    if (arguments.length == 1) 
    return _ceil(number); 

    multiplier = Math.pow(10, decimals); 
    return _ceil(number * multiplier)/multiplier; 
} 

Тогда в другом месте ... return (Math.ceil((amount - 0.05), 1) + 0.05).toFixed(2);

, который приводит к ...

BEFORE | AFTER 
    2.51 | 2.55 
    2.50 | 2.55 
    2.56 | 2.65 

ответ

23

Умножить на 20, а затем разделить на 20:

(Math.ceil(number*20)/20).toFixed(2) 
+0

Perfect - спасибо очень много. Можете ли вы объяснить, почему вы должны это делать? – Sam

+4

, хотя я бы подумал об этом изменении 'Math.ceil (число * 20 - 0,5)/20). ToFixed (2)' – Arth

+0

1 = 20 * 0.05; вы умножаетесь на 20, чтобы округление до следующего целого числа и последующее деление на 20 эквивалентно округлению до следующего 0,05 в оригинале. – Armatus

6

ответ Робы с моим дополнением:

Math.ceil(number*20 - 0.5)/20).toFixed(2) 

В противном случае он всегда округляется до ближайшего 0,05.

** UPDATE **

К сожалению было отмечено, что это не то, что ориг плакат хотел.

+0

Я одобрил ваш комментарий, но потом я понял, что ОП попросил округлить (см. Название вопроса). –

+4

+1, потому что это было именно то, что _I_ искал! – rymo

4

Я бы выбрал стандарт фактического деления на число, на которое вы факторизуете его, и округляя его и снова умножая на него. Это, кажется, правильный рабочий метод, который вы можете использовать с любым числом и поддерживать ментальный образ того, чего вы пытаетесь достичь.

var val = 26.14, 
    factor = 0.05; 

val = Math.round(val/factor) * factor; 

Это будет работать десятки, сотни или любое количество. Если вы специально округлите до более высокого номера, используйте Math.ceil вместо Math.round.

2

Я хотел бы написать функцию, которая делает это для вас

  • переместить десятичную более двух мест (умножить на 100)
  • тогда моды (%), что inflatedNumber на 5 и получить остаток
  • вычесть remainder из 5, так что вы знаете, что «разрыв» (ceilGap) между вашим номером и следующим ближайшим .05
  • наконец, разделить inflatedNumber на 100, так что он вернется к исходному поплавку и вуаля, ваше число будет округлено до ближайшего 0,05.

    function calcNearestPointZeroFive(num){ 
        var inflatedNumber = num*100, 
         remainder  = inflatedNumber % 5; 
         ceilGap  = 5 - remainder 
    
        return (inflatedNumber + ceilGap)/100 
    } 
    

Если вы хотите оставить номера как 5,50 нетронутых вы всегда можете добавить эту шашку:

if (remainder===0){ 
    return num 
} else { 
    var ceilGap = 5 - remainder 
    return (inflatedNumber + ceilGap)/100 
} 
0

Вам нужно положить -1 обогнуть половину вниз и после этого умножить на -1 как в примере ниже.

<script type="text/javascript"> 
 

 
    function roundNumber(number, precision, isDown) { 
 
    var factor = Math.pow(10, precision); 
 
    var tempNumber = number * factor; 
 
    var roundedTempNumber = 0; 
 
    if (isDown) { 
 
     tempNumber = -tempNumber; 
 
     roundedTempNumber = Math.round(tempNumber) * -1; 
 
    } else { 
 
     roundedTempNumber = Math.round(tempNumber); 
 
    } 
 
    return roundedTempNumber/factor; 
 
    } 
 
</script> 
 

 
<div class="col-sm-12"> 
 
    <p>Round number 1.25 down: <script>document.write(roundNumber(1.25, 1, true));</script> 
 
    </p> 
 
    <p>Round number 1.25 up: <script>document.write(roundNumber(1.25, 1, false));</script></p> 
 
</div>

Смежные вопросы