Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中获取数字小数位数的最简单方法_Javascript_Jquery_Numbers_Mootools_Decimal Point - Fatal编程技术网

在JavaScript中获取数字小数位数的最简单方法

在JavaScript中获取数字小数位数的最简单方法,javascript,jquery,numbers,mootools,decimal-point,Javascript,Jquery,Numbers,Mootools,Decimal Point,有没有比我的例子更好的方法来计算一个数字的小数位数 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 countDe

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

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);
速度测试:

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

例如

它的工作原理是将数字转换为字符串,在处拆分并返回数组的最后一部分,如果数组的最后一部分未定义(如果没有小数点,则返回0)

如果不想将其绑定到原型,可以使用以下方法:

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

以黑色编辑:

我已经修复了这个方法,使它也能处理较小的数字,如
0.000000001

Number.prototype.countDecimals=函数(){
if(Math.floor(this.valueOf())==this.valueOf())返回0;
var str=this.toString();
if(str.indexOf(“.”)!=-1&&str.indexOf(“-”)!=-1){
返回str.split(“-”[1]| | 0;
}else if(str.indexOf(“.”)=-1){
返回str.split(“.”[1]。长度| | 0;
}
返回str.split(“-”[1]| | 0;
}
var x=23.453;
console.log(x.countDecimals());//9
var x=0.0000000001;
console.log(x.countDecimals());//10
var x=0.000000000000270;
console.log(x.countDecimals());//13
变量x=101;//整数

console.log(x.countDecimals());//0
正则表达式在计算中效率很低,如果可以换一种方法,它们就很卑鄙。所以我会避开他们:)

像“数字%1”这样的东西返回四舍五入的十进制值(2.3%1=0.29999999998),一般来说,我建议您尽早使用字符串,因为实数的近似值可以更改小数的数量

所以你的很好,但我会想办法优化它

编辑:

函数计数小数位数(数字)
{
var char\u array=number.toString().split(“”;//拆分每个字符
var not_decimal=char_array.lastIndexOf(“.”);

return(not_decimal添加到series0ne answer如果希望代码不引发整数错误,并且在没有小数时得到0的结果,请使用以下方法:

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

看一看这个非常彻底的答案谢谢,但是提问者指定数字中必须有一个小数,而我没有。有趣的是+1link@PhilippeTrE.PANIER,考虑在大的方案中更重要的是:java执行的速度有多快(我的答案和Pete D的差别最小),以及下载到客户端的速度?由于Pete D的答案短了几个字节,就我个人而言,我很难选择哪一个。@series0ne,我很难选择,但由于您对代码的工作原理进行了解释,您给出了原型方法,并且您的答案比他的答案快,我给出了正确的答案t哦,你。@PhilippeTrépanier,很公平,我不能反驳!:-)谢谢。这会对整数产生一个错误:但对OPAlso来说可能不是问题。它会对非常小的小数产生错误。(例如0.00000000 1)一些国家使用逗号作为十进制分隔符,而不是句号。我过去曾使用过这种快速的“n”脏检测技巧来处理:
var isComma=Boolean(parseFloat(1/2).toString().indexOf(“,”)=-1);
您的最后一行将变成:
返回值.toString().split((isComma?”,“:”)[1].length | | 0;
现在有了可选的链接,这可能会使函数更安全(例如NaN)
value.toString().split(“.”[1]?.length | | 0;
这对于某些数字是中断的,例如0.0000001。可能更快一些:
var countDecimals=function(value){返回值%1?value.toString().split(“.”[1].length:0;};
@OP您应该用jsperf测试答案,看看哪一个似乎是最好的答案因为JavaScript是一种大小关键型语言,您可以省略else语句。例如..if(true)return x;return 0;…基本上,如果它不返回小数的数量,只返回0;是的,使用三元组会更快,但我认为它更容易阅读和理解这个概念。OP可以用更快的方式改变这个概念。@我做到了,series0ne是一个off by one错误中最快的。
char\u array.length-不是decimal
应为
char\u array.length-非十进制-1
var countDecimals = function (value) {
    if(Math.floor(value) === value) return 0;
    return value.toString().split(".")[1].length || 0; 
}
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;
}
var countDecimals = function (value) { 
    if ((value % 1) != 0) 
        return value.toString().split(".")[1].length;  
    return 0;
};