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

IT技术 javascript tofixed
2021-03-07 19:49:41

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

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

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

测试输入:

  输入输出  
123456.781 -> 123456.78

123456.786 -> 123456.79

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

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

6个回答

那更简单:

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

所以:

truncateToDecimals(123456.786) -> 123456.78
truncateToDecimals(99999999999999.9999,2) 回报 100000000000000
2021-04-20 19:49:41
这里可能需要注意的是,如果为零,该函数将减少小数点(在:2.20 中将是 2.2)。但在我看来这没问题,因为这是 javascript 的工作方式,对吗?尊重。我的意思是,您可以改为返回 toFixed(),但在这种情况下,返回的类型将是一个我认为不公平的字符串。如果您想这样做,请在函数之外进行,例如在 UI 端,并保持数字逻辑清晰。这样您就可以防止将来出现错误和丑陋的工件。
2021-04-29 19:49:41
那是因为您要添加一个新的小数,因为 dec 参数的默认值是 2。您可以传递 dec=1 或修复函数以从传递的数字中获取默认小数长度。
2021-05-01 19:49:41
并不总是有效。4492903605.9 产生 4492903605.89
2021-05-12 19:49:41

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

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

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

这失败是因为 1.13 的内部浮点表示非常小于 1.13 - 乘以 100 不会产生 113 而是 112.999999999999998578915 然后将其四舍五入到 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;
    }
});
这并不总是有效。尝试:Math.floor(100 * 1.13) / 100;
2021-04-22 19:49:41
/ 100.0;? 这不是 c/c++
2021-04-26 19:49:41
非常感谢它解决了我的问题......但是等等......为什么我不能在谷歌浏览器中使用箭头键?它在 Firefox 中工作正常。
2021-05-12 19:49:41

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

/**
 * @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("");
}
toFixed(99999999999999.9999,4) 回报 100000000000000
2021-05-04 19:49:41

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

val = (Math.floor(100 * val) / 100).toFixed(2);
并不总是有效。4492903605.9 产生 4492903605.89
2021-04-28 19:49:41

如果你想避免四舍五入......例如。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);
            }   
        }
   });