令人惊讶的是,尽管其他人有类似的变体,但此函数尚未被发布。它来自于 MDN Web Docs 的 Math.round()
。
function precisionRound(number, precision) {
var factor = Math.pow(10, precision);
return Math.round(number * factor) / factor;
}
console.log(precisionRound(1234.5678, 1));
console.log(precisionRound(1234.5678, -1));
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 );
};
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'>
更新:2019年8月20日
刚刚注意到这个错误。我相信这是由于使用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
映射为有限的二进制浮点数。 - Aaron Digulla(new Number(0.1)).valueOf()
的值为0.1
。 - Salman A