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

时间:2012-05-30 00:50:22

标签: 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中的箭头键?

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

6 个答案:

答案 0 :(得分: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;
    }
});

答案 1 :(得分:6)

这更简单:

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

所以:

truncateToDecimals(123456.786) -> 123456.78

答案 2 :(得分:4)

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

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

答案 3 :(得分:4)

你可以尝试一下,它不会围绕你的小数

var toFixed = function(val, decimals) {
  var arr = ("" + val).split(".")
  if(arr.length === 1) 
    return val
  var int = arr[0],
      dec = arr[1],
      max = dec.length - 1
  return decimals === 0 ? int :
    [int,".",dec.substr(0, decimals > max ? max : decimals)].join("")
}

答案 4 :(得分:1)

如果你想避免四舍五入...... 防爆。 1.669 =&gt; 1.67,548.466 =&gt; 548.47

功能结果如下:1.669 =&gt; 1.66,548.466 =&gt; 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);
            }   
        }
   });

答案 5 :(得分: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));