20

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

結果として...

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

8 に答える 8

43

20を掛けてから、20で割ります。

(Math.ceil(number*20)/20).toFixed(2)
于 2012-05-02T12:19:28.883 に答える
17

私の追加でのロブの答え:

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

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

** アップデート **

申し訳ありませんが、これは元のポスターが望んでいたものではないことが指摘されています。

于 2012-05-02T12:28:05.753 に答える
11

私は実際にあなたがそれを因数分解している数で割って、それを丸めて、後で再びそれを掛けるという基準に行きます。それは、いくつでも使用でき、達成しようとしていることの精神的なイメージを維持できる適切な作業方法のようです。

var val = 26.14,
    factor = 0.05;

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

これは、数十、数百、または任意の数で機能します。特に高い数値に丸める場合は、のMath.ceil代わりにを使用してMath.roundください。

特に小数点以下1桁以上(半分ではなく)に丸めるための別の方法は次のとおりです。

Number(Number(1.5454545).toFixed(1));

固定数の文字列を作成し、それを実数に変換しNumberます。

于 2014-01-27T14:24:21.147 に答える
3

私はあなたのためにそれをする関数を書くでしょう

  • 小数点を2桁上に移動します(100を掛けます)
  • 次に、それを5でmod(%)しinflatedNumber、余りを取得します
  • 5からを引くと、自分の番号と次に近い.05の間remainderの「ギャップ」()がわかります。ceilGap
  • 最後に、inflatedNumber元のフロートに戻るように100で除算すると、出来上がり、数値は最も近い.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
}
于 2015-07-28T17:15:19.313 に答える
1

半分を切り捨てるには-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>

于 2017-10-25T12:51:13.553 に答える
1

私は自分のプロジェクトでこの関数を使用することになりました。

roundToNearestFiveCents( number: any ) {
    return parseFloat((Math.round(number / 0.05) * 0.05).toFixed(2));
}

金銭的な結果を5セント単位で四捨五入したい場合は、結果に数値を保持するので、さらに加算を実行しても文字列の連結にはなりません。また、他のいくつかの回答が指摘しているように、不必要に切り上げられることはありません。また、これは小数第2位に制限されています。これは、財務では一般的です。

于 2018-08-15T11:44:13.373 に答える
1

私の解決策とテスト:

let round = function(number, precision = 2, rounding = 0.05) {
  let multiply = 1 / rounding;

  return parseFloat((Math.round(number * multiply) / multiply)).toFixed(precision);
};

https://jsfiddle.net/maciejSzewczyk/7r1tvhdk/40/

于 2019-10-05T08:58:04.110 に答える
0

OPは銀行の四捨五入について明示的ではありませんが、0.05ドル(5セント)に最も近い切り上げは銀行の四捨五入と互換性があるはずです。Arthによって提案されたものは、RobWによって受け入れられた回答よりも正確です。

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

バンカーの丸めでは、JavaScriptのガウス/バンカーの丸めで提案されている基本的なバンカーの丸め関数が必要です。TypeScriptで書き直します。

    static bankerRound(num: number, decimalPlaces?: number) {
        const d = decimalPlaces || 0;
        const m = Math.pow(10, d);
        const n = +(d ? num * m : num).toFixed(8);
        const i = Math.floor(n), f = n - i;
        const e = 1e-8;
        const r = (f > 0.5 - e && f < 0.5 + e) ?
            ((i % 2 === 0) ? i : i + 1) : Math.round(n);
        return d ? r / m : r;
    }

    static roundTo5cents(num: number) {
        const r = bankerRound(Math.ceil(num * 20 - 0.5) / 20, 2);
        return r;
    }

このアルゴリズムの正しさは、MBS Online( http://www9.health.gov.au/mbs/ready_reckoner.cfm?item_num=60など)で確認できます。

于 2021-01-18T05:03:59.963 に答える