น่าแปลกที่ฟังก์ชั่นนี้ยังไม่ได้โพสต์ถึงแม้ว่าคนอื่น ๆ จะมีรูปแบบที่คล้ายคลึงกัน มันมาจากเอกสารเว็บ MDN สำหรับ Math.round () มันกระชับและช่วยให้แม่นยำแตกต่างกัน
function precisionRound(number, precision) {
var factor = Math.pow(10, precision);
return Math.round(number * factor) / factor;
}
console.log (precisionRound (1234.5678, 1)); // ผลลัพธ์ที่คาดหวัง: 1234.6
console.log (precisionRound (1234.5678, -1)); // ผลลัพธ์ที่คาดหวัง: 1230
var inp = document.querySelectorAll('input');
var btn = document.querySelector('button');
btn.onclick = function(){
inp[2].value = precisionRound( parseFloat(inp[0].value) * parseFloat(inp[1].value) , 5 );
};
//MDN function
function precisionRound(number, precision) {
var factor = Math.pow(10, precision);
return Math.round(number * factor) / factor;
}
button{
display: block;
}
<input type='text' value='0.1'>
<input type='text' value='0.2'>
<button>Get Product</button>
<input type='text'>
ปรับปรุง: ส.ค. / 20/2019 เพิ่งสังเกตเห็นข้อผิดพลาดนี้ ฉันเชื่อว่าเกิดจากข้อผิดพลาดความแม่นยำของทศนิยมกับ Math.round ()
precisionRound(1.005, 2) // produces 1, incorrect, should be 1.01
เงื่อนไขเหล่านี้ทำงานอย่างถูกต้อง:
precisionRound(0.005, 2) // produces 0.01
precisionRound(1.0005, 3) // produces 1.001
precisionRound(1234.5, 0) // produces 1235
precisionRound(1234.5, -1) // produces 1230
การแก้ไข:
function precisionRoundMod(number, precision) {
var factor = Math.pow(10, precision);
var n = precision < 0 ? number : 0.01 / factor + number;
return Math.round( n * factor) / factor;
}
นี่จะเพิ่มตัวเลขไปทางขวาเมื่อปัดเศษทศนิยม MDN ได้อัปเดตหน้า Math.round ดังนั้นอาจมีบางคนที่สามารถให้ทางออกที่ดีกว่า
0.1
กับจำนวนจุดลอยตัวไบนารี จำกัด