javascript - 如何防止toFixed舍入十进制数

The*_*iot 9 javascript tofixed

我对html,javascript和css很新,所以请原谅我的问题听起来很愚蠢.我的问题是如何防止函数toFixed()舍入十进制数.

这是我的链接:http://jsfiddle.net/RWBaA/4/

我正在尝试做的是,只要用户在文本框中输入,我就会检查输入是否为有效的十进制数.同时我还想检查输入是否是有效货币,这意味着它只能在小数点右侧再添加两个数字.问题是当用户在小数点后输入第3个数字时,如果第3个数字> = 5,则小数点后的第2个数字四舍五入到最接近的百分数.

测试输入:

  Input         Output  
123456.781 -> 123456.78

123456.786 -> 123456.79

为什么我的代码不允许使用chrome中的箭头键?

请帮忙.如果您有更好的解决方案,您可以自由建议.提前致谢.

Aln*_*tak 11

将数字(向下)舍入到最接近的分数:

val = Math.floor(100 * val) / 100;
Run Code Online (Sandbox Code Playgroud)

编辑有人指出,这例如1.13失败.我应该更了解自己!

这失败是因为1.13的内部浮点表示略小于1.13 - 乘以100不会产生113而是112.99999999999998578915然后将其向下舍入使其达到1.12

重新阅读这个问题后,您似乎真的只是尝试执行输入验证(见下文),在这种情况下,您应该使用普通的表单验证技术,而您根本不应该使用它.toFixed().该功能用于显示数字,而不是用它们计算.

$('#txtAmount').on('keypress', function (e) {
    var k = String.fromCharCode(e.charCode);
    var v = this.value;
    var dp = v.indexOf('.');

    // reject illegal chars
    if ((k < '0' || k > '9') && k !== '.') return false;

    // reject any input that takes the length
    // two or more beyond the decimal point
    if (dp >= 0 && v.length > dp + 2) {
        return false;
    }

    // don't accept >1 decimal point, or as first char
    if (k === '.' && (dp >= 0 || v.length === 0)) {
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 9

这甚至更简单:

function truncateToDecimals(num, dec = 2) {
  const calcDec = Math.pow(10, dec);
  return Math.trunc(num * calcDec) / calcDec;
}
Run Code Online (Sandbox Code Playgroud)

所以:

truncateToDecimals(123456.786) -> 123456.78
Run Code Online (Sandbox Code Playgroud)


小智 5

此外,为了防止 toFixed() 四舍五入小数并将您的数字变成两位小数,您可以使用它,

val = (Math.floor(100 * val) / 100).toFixed(2);
Run Code Online (Sandbox Code Playgroud)


San*_*dez 5

您可以尝试一下,它不会舍入小数

/**
 * @param {any} input 
 * @param {number} decimals 
 */
var toFixed = function(input, decimals) {
  var arr = ("" + input).split(".");
  if (arr.length === 1) return input;
  var int = arr[0],
      max = arr[1].length,
      dec = arr[1].substr(0, decimals > max ? max : decimals);
  return decimals === 0 ? int : [int, "." , dec].join("");
}
Run Code Online (Sandbox Code Playgroud)