2

重複の可能性:
JavaScript の浮動小数点演算は壊れていますか?
JavaScript で float を丸める

この関数が間違った 10 進数値を増やすのはなぜですか? 小数点以下を 1 つだけ表示したい。

var valueElement = $('#valueTempe');
function incrementValue(e){
    if(valueElement.text() < 6){
        valueElement.text(Math.max(parseFloat(valueElement.text()) + e.data.increment)); 
    }

    return false;
}
$('#plus').bind('click', {increment: 0.1}, incrementValue);     
$('#minus').bind('click', {increment: -0.1}, incrementValue);

jsFiddle:テスト

4

2 に答える 2

3

同様1/3に、 を 10 進数で正確に表現する0.1ことも、2 進数で正確に表現することもできず、Javascript の数値は 2 進浮動小数点値です。

Javascript ではを0.2 + 0.1返します0.30000000000000004
ブラウザのコンソールで試してみてください。

実際には、仮数を Javascript 64 ビット浮動小数点値に格納するために 53 ビットが使用可能であり、0.153 ビットの精度に丸められた 2進数の 10 進数値は、10 進
0.00011001100110011001100110011001100110011001100110011010
数に戻すと正確に になり
0.1000000000000000055511151231257827021181583404541015625ます。

これは Firefox で使用して表示できtoFixedます (他のブラウザでは引数が 20 に制限されています):
(0.1).toFixed(55)return 0.1000000000000000055511151231257827021181583404541015625.

同様に、0.253 ビットの精度に丸められてから 10 進数に戻される 2 進数の 10 進数値は、正確に
0.200000000000000011102230246251565404236316680908203125です。

と の 2 つのバイナリ表現を加算する0.10.2、53 ビットに丸められてから 10 進数に変換され、正確に が得られます
0.3000000000000000444089209850062616169452667236328125

したがって、Javascriptの0.1+の結果は ではありませんが、小数点以下 17 桁までは です。0.20.30.30000000000000004

実際、0.3とにかくバイナリ自体で正確に表現することはできません。
実際には、10 進値に相当するバイナリとして格納される
0.29999999999999993338661852249060757458209991455078125
ため、Javascript では
0.2 + 0.1 == 0.3が返されますfalse


10 進数から 2
進数へ 10 進数を 2 進数で正確に表すことができる2のは、最小項で単純な分数として表現したときに、 がその数の分母の唯一の素因数である場合だけです。
たとえば、
0.11/10であり、10素因数2および5があるため、正確な表現はありません。
0.5is1/2であり、 is の唯一の素因数で2ある2ため、正確に表すことができます。

于 2013-01-18T12:05:35.893 に答える
2

以下のように .toFixed(1) を使用できます

var valueElement = $('#valueTempe');
function incrementValue(e){
    if(valueElement.text() < 6){
        valueElement.text(Math.max(parseFloat(valueElement.text()) + e.data.increment).toFixed(1)); 
    }
    if(valueElement.text() == 6){
        valueElement.text(Math.max(parseFloat(valueElement.text()) -1).toFixed(1));
    }
    return false;
}


$('#plus').bind('click', {increment: 0.1}, incrementValue);     
$('#minus').bind('click', {increment: -0.1}, incrementValue);

デモ

于 2013-01-18T12:05:10.823 に答える