web-dev-qa-db-ja.com

数値を最も近い3の倍数に切り上げる

干し草、最も近い3の倍数を四捨五入するにはどうすればよいですか?

すなわち

25 would return 27
1 would return 3
0 would return 3
6 would return 6

ありがとう

34
dotty
    if(n > 0)
        return Math.ceil(n/3.0) * 3;
    else if( n < 0)
        return Math.floor(n/3.0) * 3;
    else
        return 3;
68
Cambium

はい、どうぞ!

Number.prototype.roundTo = function(num) {
    var resto = this%num;
    if (resto <= (num/2)) { 
        return this-resto;
    } else {
        return this+num-resto;
    }
}

例:

y = 236.32;
x = y.roundTo(10);

// results in x = 240

y = 236.32;
x = y.roundTo(5);

// results in x = 235
20
Makram Saleh

単に:

3.0*Math.ceil(n/3.0)

17
Iwan B.

受け入れられた回答へのコメントで述べたように、あなたはこれを使うことができます:

Math.ceil(x/3)*3

xが0の場合は3を返しませんが、これはOPによる誤りである可能性が高いためです。)

これより前に投稿された9つの回答(削除されていないか、スコアが低く、すべてのユーザーに表示されない)のうち、Dean Nicholsonによる回答のみ(重要性が失われた問題を除く)および美容師は正しいです。受け入れられた答えは負の数に対して誤った結果を与え、OPによる誤りである可能性が高いことを説明するために0の例外を追加します。他の2つの回答は、常に端数を切り上げるのではなく、最も近い倍数に数値を丸めます。1つ以上は負の数に対して間違った結果を与え、3つは正数に対して間違った結果を与えます。

11
nisetama

私は主にSystemVerilogとVera(ASIC HDL)でプログラムするので、私はこれを疑似コードで答えています。 %はモジュラス関数を表します。

round_number_up_to_nearest_divisor = number + ((divisor - (number % divisor)) % divisor)

これはどのような場合でも機能します。

数値の係数は剰余を計算し、除数からその数を引くと、次の除数の倍数に到達するために必要な数が得られ、「魔法」が発生します。単一のモジュラス関数があれば十分だと思いますが、数値が除数の正確な倍数である場合は、余分な倍数が計算されます。つまり、24は27を返します。追加の係数は、加算を0にすることでこれを防ぎます。

10
Dean Nicholson

この関数は、指定した因子の最も近い倍数に切り上げます。 0または既に倍数である数値は切り上げません。

round_up = function(x,factor){ return x - (x%factor) + (x%factor>0 && factor);}

round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
0
round_up(6,3)
6

0の動作は要求したものではありませんが、この方法の方が一貫していて便利です。 0を切り上げたい場合は、次の関数でそれを行います。

round_up = function(x,factor){ return x - (x%factor) + ( (x%factor>0 || x==0) && factor);}

round_up(25,3)
27
round up(1,3)
3
round_up(0,3)
3
round_up(6,3)
6
6
beauburrier

@Makramのアプローチに基づいて構築し、@ Adamの後続のコメントを組み込んで、元のMath.prototypeの例を​​変更して、ゼロ中心システムと不偏システムの両方で負の数を正確に丸めるようにしました。

Number.prototype.mround = function(_mult, _zero) {

  var bias = _zero || false;
  var base = Math.abs(this);
  var mult = Math.abs(_mult);

  if (bias == true) {
    base = Math.round(base / mult) * _mult;
    base = (this<0)?-base:base ;
  } else { 
    base = Math.round(this / _mult) * _mult;
  }

  return parseFloat(base.toFixed(_mult.precision()));

}

Number.prototype.precision = function() {
  if (!isFinite(this)) return 0;
  var a = this, e = 1, p = 0;
  while (Math.round(a * e) / e !== a) { a *= 10; p++; }
  return p;
}

例:(-2).mround(3)は-3を返します。
(0).mround(3)は0を返します。
(2).mround(3)は3を返します。
(25.4).mround(3)は24を返します。
(15.12).mround(.1)は15.1を返します

2
Roger Grace

(n-n mod 3)+3

1
PaulJWilliams
$(document).ready(function() {
    var modulus = 3;
    for (i=0; i < 21; i++) {
        $("#results").append("<li>" + roundUp(i, modulus) + "</li>")
    }
});


function roundUp(number, modulus) {
    var remainder = number % modulus;
    if (remainder == 0) {
        return number;
    } else {
        return number + modulus - remainder;
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Round up to nearest multiple of 3:
<ul id="results">
</ul>
0
CAK2

より一般的な問題で誰かを助ける可能性のあるより一般的な答え:数値を小数の倍数に丸めたい場合は、ライブラリの使用を検討してください。これは、小数が入力に入力され、たとえば、0.25、0.2、0.5などの倍数に強制したいGUIでの有効なユースケースです。この場合、単純なアプローチではうまくいきません。

function roundToStep(value, step) {
  return Math.round(value / step) * step;
}

console.log(roundToStep(1.005, 0.01)); // 1, and should be 1.01

何時間も自分の関数を書いてnpmパッケージを検索した後、 Decimal.js ですぐに仕事ができると判断しました。それには、まさにそれを行うtoNearestメソッドもあり、切り上げ、切り捨て、またはより近い値(デフォルト)のどちらにするかを選択できます。

const Decimal = require("decimal.js")

function roundToStep (value, step) {
  return new Decimal(value).toNearest(step).toNumber();
}

console.log(roundToStep(1.005, 0.01)); // 1.01

RunKitの例

0
Adam Jagosz