2012-05-02 4 views
6

質問
浮動小数点数を最も近い0.05に丸める方法は誰も知っていますか?JavaScriptで最も近い0.05に切り上げる

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

20によって

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

答えて

23

掛け、その後、20で割る:

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

パーフェクト - どうもありがとうございました。なぜあなたはこれを行う必要があるのか​​説明できますか? – Sam

+4

私はこの変更を 'Math.ceil(number * 20 - 0.5)/ 20).toFixed(2)' – Arth

+0

1 = 20 * 0.05と考えています。次の整数への丸めを行い、20で除算することは、元の次の0.05に丸めることと等価になるように、20を掛けます。 – Armatus

6

私の添加とロブの答え:

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

それ以外の場合は、常に最も近い0.05に切り上げられます。

** UPDATE **

は申し訳ありませんが、これは原点復帰ポスターが欲しかったものではありませんが指摘されています。

+0

私はあなたのコメントをupvotedしましたが、その後、OPはラウンドアップするように質問しました(質問のタイトルを参照)。 –

+4

+1これはまさに_I_が探していたものだったからです! – rymo

4

私は実際にそれを因数分解する数で除算し、それを四捨五入して、それを再び乗算するという基準になります。それはあなたが達成しようとしているものの精神的なイメージを維持し、どんな数でも使用できる適切な作業方法のようです。

var val = 26.14, 
    factor = 0.05; 

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

これは、数十、数または任意の数で動作します。高い数字に四捨五入している場合はMath.roundの代わりにMath.ceilを使用してください。

2

私は(乗算100によって)二つの場所

  • 5により、その後、MOD(%)そのinflatedNumber

    • 移動小数であなたのためにそれを行う機能を書き、残りを得るでしょう
    • あなたは「ギャップ」(ceilGapが)最後に、あなたのを分割し、あなたの番号と次に近い0.05
    • の間にあるものを知っているように、5からremainderを引きますを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>

    関連する問題