Pertanyaan JavaScript menambahkan angka desimal yang mengeluarkan [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Jadi saya membuat skrip yang menambahkan dua angka (angka desimal) bersama-sama, yang saya temui masalah.

http://jsfiddle.net/DerekL/esqnC/

Saya membuat skrip, ternyata cukup bagus:

0.1 + 0.5  //0.6
0.2 + 0.3  //0.5

Tetapi segera saya melihat:

0.1 + 0.2  //0.30000000000000004
0.01 + 0.06  //0.06999999999999999

Dan itu tidak terlihat benar bagi saya. Saya tahu ini adalah kelemahan menggunakan float point dengan bit terbatas, tetapi saya tidak dapat menemukan cara untuk memperbaikinya.

Math.ceil   //No
Math.floor  //No
.slice      //No

MEMPERBARUI

Apakah mungkin untuk mengalikan angka dengan 1000 terlebih dahulu, kemudian menambahkannya kemudian membaginya dengan 1000?


32
2018-05-06 20:26


asal


Jawaban:


Menggunakan toFixed untuk mengubahnya menjadi string dengan beberapa tempat desimal dicukur, dan kemudian mengubahnya kembali menjadi angka.

+(0.1 + 0.2).toFixed(12) // 0.3

Sepertinya IE toFixed memiliki beberapa perilaku aneh, jadi jika Anda perlu mendukung IE sesuatu seperti ini mungkin lebih baik:

Math.round((0.1 + 0.2) * 1e12) / 1e12

33
2018-05-06 20:34



function add(){
    var first=parseFloat($("#first").val());
    var second=parseFloat($("#second").val());
    $("#result").val(+(first+second).toFixed(2));
}

DEMO.


4
2018-05-06 20:52



Ini masalah umum dengan floating point.

Menggunakan toFixed dalam kombinasi dengan parseFloat.

Disini adalah contoh di JavaScript.


3
2018-05-06 20:54



Menguji Javascript ini:

var arr = [1234563995.721, 12345691212.718, 1234568421.5891, 12345677093.49284];

var sum = 0;
for( var i = 0; i < arr.length; i++ ) {
    sum += arr[i];
}

alert( "fMath(sum) = " + Math.round( sum * 1e12 ) / 1e12 );
alert( "fFixed(sum) = " + sum.toFixed( 5 ) );

Kesimpulan

Jangan gunakan Math.round( (## + ## + ... + ##) * 1e12) / 1e12

Sebaliknya, gunakan ( ## + ## + ... + ##).toFixed(5) )

Di IE 9, toFixed bekerja dengan sangat baik.


3
2017-11-14 22:06