71

有没有比我的例子更好的方法来计算数字的小数位数?

var nbr = 37.435.45;
var decimals = (nbr!=Math.floor(nbr))?(nbr.toString()).split('.')[1].length:0;

更好是指更快地执行和/或使用本机 JavaScript 函数,即。类似 nbr.getDecimals() 的东西。

提前致谢!

编辑:

修改 series0ne 答案后,我能管理的最快方法是:

var val = 37.435345;
var countDecimals = function(value) {
    if (Math.floor(value) !== value)
        return value.toString().split(".")[1].length || 0;
    return 0;
}
countDecimals(val);

速度测试:http: //jsperf.com/checkdecimals

4

3 回答 3

130
Number.prototype.countDecimals = function () {
    if(Math.floor(this.valueOf()) === this.valueOf()) return 0;
    return this.toString().split(".")[1].length || 0; 
}

当绑定到原型时,这允许您countDecimals();直接从数字变量中获取十进制计数 ( )。

例如

var x = 23.453453453;
x.countDecimals(); // 9

它通过将数字转换为字符串,在. 并返回数组的最后一部分,如果数组的最后一部分未定义(如果没有小数点,则会发生这种情况),则返回 0。

如果您不想将其绑定到原型,则可以使用:

var countDecimals = function (value) {
    if(Math.floor(value) === value) return 0;
    return value.toString().split(".")[1].length || 0; 
}

布莱克编辑:

我已经修复了该方法,使其也适用于较小的数字,例如0.000000001

Number.prototype.countDecimals = function () {

    if (Math.floor(this.valueOf()) === this.valueOf()) return 0;

    var str = this.toString();
    if (str.indexOf(".") !== -1 && str.indexOf("-") !== -1) {
        return str.split("-")[1] || 0;
    } else if (str.indexOf(".") !== -1) {
        return str.split(".")[1].length || 0;
    }
    return str.split("-")[1] || 0;
}


var x = 23.453453453;
console.log(x.countDecimals()); // 9

var x = 0.0000000001;
console.log(x.countDecimals()); // 10

var x = 0.000000000000270;
console.log(x.countDecimals()); // 13

var x = 101;  // Integer number
console.log(x.countDecimals()); // 0

于 2013-06-28T16:17:34.283 回答
40

如果您希望代码不为整数抛出错误并在没有小数时得到 0 的结果,请添加到 series0ne 答案,请使用以下命令:

var countDecimals = function (value) { 
    if ((value % 1) != 0) 
        return value.toString().split(".")[1].length;  
    return 0;
};
于 2013-06-28T16:25:45.787 回答
1

正则表达式的计算效率非常低,如果您可以采用另一种方式,它们就很卑鄙。所以我会避开他们:)

诸如“Number % 1”之类的东西返回四舍五入的十进制值(2.3 % 1 = 0.2999999999999998),总的来说,我建议您尽早使用字符串,因为实数的近似值可以改变小数位数。

所以你的很好,但我会寻找一种优化它的方法。

编辑:

function CountDecimalDigits(number)
{
  var char_array = number.toString().split(""); // split every single char
  var not_decimal = char_array.lastIndexOf(".");
  return (not_decimal<0)?0:char_array.length - not_decimal;
}
于 2013-06-28T16:22:34.993 回答