isNumberKey与truncateDecimals结合使用会导致输入字段出现异常舍入

问题描述

正在发生的事情的视频:

https://gyazo.com/d87f148bca1e59440382de8a63c83695

输入10.2,然后截断似乎可以立即将其四舍五入到10.19。我正在使用此代码作为输入:

<input type="number" name="inputVeLocity" onkeypress="return isNumberKey(event)" onkeyup="return truncateDecimals(this,2)" id="initialVeLocity" class="reset_form" value="10" step="0.01" required>

我尝试删除步骤和值数字,但这并没有解决问题。因此问题可能出在脚本内:

function isNumberKey(evt) {
  let charCode = (evt.which) ? evt.which : evt.keyCode;
  if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 46) {
    evt.preventDefault();
    return false;
  }
  return true;
}

function truncateDecimals(obj,decimals) {
  if (obj.value % Math.round(obj.value)) {

    let divisor = Math.pow(10,decimals);
    obj.value = Math.floor(obj.value * divisor) / divisor;
  }

  console.log(obj.value);
  return true;
}

感谢您的帮助。这已经困扰了几天了。

解决方法

我有一个解决此问题的答案:

删除truncateDecimals函数并替换为:

let validate = function(e) {
  let t = e.value;
  e.value = (t.indexOf(".") >= 0) ? (t.substr(0,t.indexOf(".")) + t.substr(t.indexOf("."),3)) : t;
}

onkeyup="return truncateDecimals(this,2)"替换为:

oninput="validate(this)" 

并将type="number"替换为:

type="text"

这可以防止错误的小数位数和浮点小数。