web-dev-qa-db-ja.com

JavaScriptで小数点以下100分の1に四捨五入

数値を表す変数を使用して、JavaScriptで簡単な計算を行っています。これが私のコードの例です:

var ones = 0;
var fives = 0;
function results (){
    _fives = (fives * 5);
    var res = (_fives + ones);
    document.innerHTML = res;
}

これは完全なコードではありませんが、基本的には、ユーザーに1セント硬貨から100ドル紙幣までの紙幣と硬貨の金額を入力してもらいます。このコードは、請求額に請求額を掛けます。これは問題なく動作します...私の結果のいくつかで何らかの理由で1.899999999997のような小数が表示され、これがどのように起こっているのかわかりません。

これを変更して、小数点以下100分の1に丸める方法はありますか?

たとえば、1.89999999997と表示される代わりに、実際には1.90と表示されますが、これは大きな問題ではありません。これは私が自分で丸めることができる個人的なことですが、将来の参考のためにこれを行う方法を学ぶのは素晴らしいことです。

12

[〜#〜] update [〜#〜]:MDNには実際には 浮動小数点の不正確さを回避する小数点以下の四捨五入の優れた例 =。それらのメソッドは、OPに基づいて常に切り上げるように変更できます。


元の(なんらかの誤り)回答

//to round to n decimal places
function round(num, places) {
    var multiplier = Math.pow(10, places);
    return Math.round(num * multiplier) / multiplier;
}

[〜#〜]編集[〜#〜]:質問を完全に読んでいませんでした。通貨について話しているので、おそらくそれを切り上げたいと思います。

//to round up to two decimal places
function money_round(num) {
    return Math.ceil(num * 100) / 100;
}
18
Rodaine

実際、この方法はすべての場合に機能するとは限りません。測定値を特定の桁数に丸めるのと同じようなことをしています。

私の場合、0.20812345967 +/- 0.0031647859のような測定値の平均と標準偏差があります。明らかに、余分な有効数字は無意味なので、0.208 +/- 0.003と書きたいと思います。浮動小数点演算を実行すると、0.20800000000000002 +/- 0.003が得られます。

通常、これは正しく丸められますが、基数10の10進数を正確にバイナリに格納できない場合があるため、このようにがらくたになります。

代わりに、文字列形式のソリューションを探します

1
Jordan

これは、次のようなことを行う場合のJavaScriptの既知の問題です。

0.1 + 0.5 = 0.600000000001 or 0.599999999998

この問題の解決策は、固定精度と丸めモードを備えたJavasSriptライブラリの1つを使用することです。 big-numbers を試すことができます。コード例は次のとおりです。

// Initialization
var bn = new BigNumbers({
    precision: 20, // fixed precision 20 digits after decimal separator 
    roundingMode: BigNumbers.RoundingMode.HALF_UP // rounding mode is Half Up
});

var number1 = bn.of('15');
var number2 = bn.of('12');


var divideResult = number1.divide(number2); // result "1.25"
var multiplyResult = divideResult.multiply(1/2); // result "0.625"
var roundingToTwoDecimalResult = multiplyResult.toPrecision(2); // result "0.63"

JavaScriptチュートリアル 同じ

0
alexey28

これはおそらく1日遅れて、1ドル足りないことはわかっていますが、私もこのようなものを探していたので、この質問からMath.roundの機能を調べました。

私はこれを思いつき、与えられた値を最も近い5番目と100番目にうまく丸めます。したがって、0.07は0.05になります。 23.45は23.45になります。 1006.32は1006.30になります。

<script>
function rounder() {
var exampleInput = $("#inputId").val();
$("#output").html(((Math.round(((Math.round(exampleInput*100)/5)*5)/5)*5)/100).toFixed(2));
}
</script>

初心者なので、このコードをより効率的にする方法があると確信しています。

0
brian-welch

私が取り組んでいるベクトルプロジェクトの丸めのソリューションを実装するために取り組んでいるので、私は実際にこれに取り組んできました。私は実際にこの古い(2011) javascripter.net リソースがそれを作成していないことに驚いています。特に、前述の_Math.round( // ..._を使用しているためです。

私はそれに少し追加しましたが、.toFixed()も利用します(ただし、この段階では、個人的にはあまり心配していませんが、後続のゼロはすべて削除されます):

_
const round = (number, places) => {
   let rounder = '1';

   for (let i = 0; i < places; i++) {
       rounder += '0';
   }

   return (Math.round(number * rounder) / rounder).toFixed(places);
};

_

効率や冗長性の観点から、上記にはいくつかの問題があると確信しています。しかし、私のポイントは、Math.round()が必要なことを実行するということです。反復後、上記の変換をスローする必要がある場合があります。

また、他のいくつかの提案されたソリューションよりもはるかに読みやすいです。

0
Thomas

小数が大きい場合の切り上げツール。 'decimal'に異なる値を割り当てることにより、異なる10進数サイズを処理するように調整できます。

const roundToWholeNumber = (num, decimal = 100000) => {

    const _roundingHelper = (val, decimalPlace) => {

        return Math.round(val * decimalPlace) / decimalPlace;

    }

    while(decimal > 1){
        num = _roundingHelper(num, decimal)
        decimal = decimal / 10
    }

    return Math.round(num)   
}
roundToWholeNumber(5.44444555)
0
Nja

これは私が取り組んでいるアプリの1つで個人的に使用することに決めたものです!

const roundToHundredth = (value) => {
  return Number(value.toFixed(2));
};

console.log(roundToHundredth(1.98723232))
console.log(roundToHundredth(3.14159265359))
console.log(roundToHundredth(2.67528))
0
calcazar