14

我对 html、javascript 和 css 很陌生,所以如果我的问题对你来说听起来很愚蠢,请原谅。我的问题是如何防止函数toFixed()四舍五入十进制数。

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

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

测试输入:

  输入输出  
123456.781 -> 123456.78

123456.786 -> 123456.79

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

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

4

7 回答 7

15

这更简单:

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

所以:

truncateToDecimals(123456.786) -> 123456.78
于 2017-05-25T15:39:32.433 回答
11

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

val = Math.floor(100 * val) / 100;

编辑有人指出,例如 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;
    }
});
于 2012-05-30T00:54:09.223 回答
7

你可以试试这个,它不会四舍五入你的小数

/**
 * @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("");
}
于 2015-09-11T05:39:00.550 回答
5

此外,为了防止 toFixed() 对小数进行四舍五入并使您的数字保留两位小数,您可以使用它,

val = (Math.floor(100 * val) / 100).toFixed(2);
于 2014-12-17T14:42:26.927 回答
1

如果你想避免四舍五入......例如。1.669 => 1.67, 548.466 => 548.47

函数结果如下所示:1.669 => 1.66, 548.466 => 548.46

那么下面的 JQuery 函数会帮助你。它经过测试并正常工作。

<input name="a" type="text" id="a" size="7%" tabindex="2">




  $('#a').keyup(function(e){
        if($(this).val().indexOf('.')!=-1){ 
            if($(this).val()=="." && $(this).val().length==1){
                this.value = parseFloat(0).toFixed(1);
            }else if($(this).val().split(".")[1].length > 2){                
                if( isNaN( parseFloat( this.value ) ) ) 
                    return;
                  this.value = $(this).val().split(".")[0]+"."+$(this).val().split(".")[1].substring(0,2);
            }   
        }
   });
于 2016-05-06T10:48:35.770 回答
0

这是经过测试的,适用于所有情况。

function truncateTwoDecimals(num, dec = 2) {
  const totalDecimal = countDecimals(num);
  if (totalDecimal === 1) {
    dec = 1;
  }
  if (totalDecimal === 2) {
    return num;
  }
  const calcDec = Math.pow(10, dec);
  return Math.trunc(num * calcDec) / calcDec;
}
function countDecimals(value) {
  if(Math.floor(value) === value) return 0;
  return value.toString().split(".")[1].length || 0; 
}
const res = truncateTwoDecimals(1.13);
console.log(res);
console.log(truncateTwoDecimals(4492903605.9));

于 2021-06-16T08:20:01.690 回答
0

这听起来可能很愚蠢,但为什么不防止在数学上四舍五入呢?

基本上你正在做的是将值替换半个精度点,这样四舍五入就变成了底线。

正常:0 到 4 变成 0 5 到 9 变成 10

减去半个精度点后:-4(变为 6)到 -1(变为 9)生成 0 0 到 4 生成 0

您需要减去 0.5/10^N 在这种情况下,对于 2 个小数 0.5/10^2 = 0.5/100 = 0.005 对于 4 个小数,您需要减去 0.00005

但是,由于浮点在计算机和 cpu 中的工作方式,您需要确保您有足够的精度来使用它。因此,我强烈建议您将精度降低到 CPU 无法搞砸的程度。

num = 123456.786
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)

num = 123456.781
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)

num = 123456.789
Math.trunc(num) + (num-Math.trunc(num)-0.005).toFixed(2)

于 2021-05-22T10:31:24.577 回答