web-dev-qa-db-ja.com

parseFloatの丸め

入力フィールドを自動的に一緒に追加するjavascript関数がありますが、1.35 + 1.35 + 1.35のような数値を追加すると、ちょうど例として4.050000000000001の出力が得られます。その長い文字列の代わりに合計を2番目の小数に丸めるにはどうすればよいですか?

入力フィールドには、1.35の例だけでなく、合計の小数点以下が2ポイントを超えないようにする必要があります。完全な作業コードは次のとおりです。

<html>
<head>
<script type="text/javascript">
function Calc(className){
var elements = document.getElementsByClassName(className);
var total = 0;

for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value);
}

document.form0.total.value = total;
}

function addone(field) {
  field.value = Number(field.value) + 1;
  Calc('add');
}
</script>
</head>
<body>
<form name="form0" id="form0">
1: <input type="text" name="box1" id="box1" class="add" value="0" onKeyUp="Calc('add')" onChange="updatesum()" onClick="this.focus();this.select();" />
<input type="button" value=" + " onclick="addone(box1);">
<br />

2: <input type="text" name="box2" id="box2" class="add" value="0" onKeyUp="Calc('add')" onClick="this.focus();this.select();" />
<input type="button" value=" + " onclick="addone(box2);">
<br />

<br />
Total: <input readonly style="border:0px; font-size:14; color:red;" id="total" name="total">
<br />
</form>
</body></html>

私が試したいくつかのことは、うまくいくはずですが、明らかに間違って実装しています:

for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value.toString().match(/^\d+(?:\.\d{0,2})?/));

var str = total.toFixed(2);

または

for(var i = 0; i < elements.length; ++i){
total += parseFloat(elements[i].value * 100) / 100).toFixed(2)

Math.floorでも運がなかった

41
JB.

toFixed()を使用して、従来の丸め方法を使用してnumを2桁の10進数に丸めます。 4.050000000000001を4.05に丸めます。

_num.toFixed(2);
_

toPrecision()を使用することをお勧めします。これは、結果の後続ゼロを取り除きます。

_1.35+1.35+1.35 => 4.050000000000001
(1.35+1.35+1.35).toFixed(2)     => 4.05
(1.35+1.35+1.35).toPrecision(3) => 4.05

// or...
(1.35+1.35+1.35).toFixed(4)     => 4.0500
(1.35+1.35+1.35).toPrecision(4) => 4.05
_

参照: JavaScript数値形式-10進精度

62
marcog
var num = 4.050000000000001;

num = num.toFixed(2);

toFixedは、探している小数点以下の桁数に応じて切り上げられます。

3
user1385191

コードでMath.round(total*100000000000)/100000000000;を使用できます。ほとんどの場合に機能します

2
user1938455

これは動作します:

$(document).ready(
    function() {
            $('#field1').blur(function(){ $('#field2').val(parseFloat($(this).val() * 2.2).toFixed(1)); });
            $('#field2').blur(function(){ $('#field1').val(parseFloat($(this).val() / 2.2).toFixed(1)); });
    }
);

これは失敗します:

$(document).ready(
    function() {
            $('#field1').blur(function(){ $('#field2').val(parseFloat($(this).val() * 2.2)).toFixed(1); });
            $('#field2').blur(function(){ $('#field1').val(parseFloat($(this).val() / 2.2)).toFixed(1); });
    }
);

したがって、括弧の配置方法に注意してください()...最初の場合、丸めは機能しますが、2番目の場合は機能しません...

1
Real Melancon

丸めの代わりに、 JavaのBigDecimalのポート を使用して、実際に正確な10進数の数学を取得することもできます。

0