使用Javascript获取小数位数

使用Javascript获取小数位数,javascript,Javascript,如何使用Javascript计算实数的小数位数(不是数字) function countDecimals(number) { } 例如,给定245.395,它应该返回3。如下所示: var val = 37.435345; var countDecimals = function(value) { let text = value.toString() // verify if number 0.000005 is represented as "5e-6"

如何使用Javascript计算实数的小数位数(不是数字)

function countDecimals(number) {

}
例如,给定245.395,它应该返回3。

如下所示:

var val = 37.435345;
var countDecimals = function(value) {
  let text = value.toString()
  // verify if number 0.000005 is represented as "5e-6"
  if (text.indexOf('e-') > -1) {
    let [base, trail] = text.split('e-');
    let deg = parseInt(trail, 10);
    return deg;
  }
  // count decimals for number in representation like "0.123456"
  if (Math.floor(value) !== value) {
    return value.toString().split(".")[1].length || 0;
  }
  return 0;
}
countDecimals(val);

其主要思想是将一个数字转换为字符串,并获得“.”的索引


您可以使用一个简单的函数,在小数点处拆分(如果有)并计算小数点后的位数。由于小数位可以用“.”或“,”(或其他字符)表示,因此您可以对此进行测试并使用适当的小数位:

function countPlaces(num) {
    var sep = String(23.32).match(/\D/)[0];
    var b = String(num).split(sep);
  return b[1]? b[1].length : 0;
}

console.log(countPlaces(2.343)); // 3
console.log(countPlaces(2.3));   // 1
console.log(countPlaces(343.0)); // 0
console.log(countPlaces(343));   // 0

以下是一种不依赖于将任何内容转换为字符串的方法:

function getDecimalPlaces(x,watchdog)
{
    x = Math.abs(x);
    watchdog = watchdog || 20;
    var i = 0;
    while (x % 1 > 0 && i < watchdog)
    {
        i++;
        x = x*10;
    }
    return i;
}
函数getDecimalPlaces(x,看门狗)
{
x=Math.abs(x);
看门狗=看门狗| | 20;
var i=0;
而(x%1>0&&i

请注意,计数不会超过看门狗的值(默认值为20)。

基于Gosha_Fighten的解决方案,为了与整数兼容:

function countPlaces(num) {
    var text = num.toString();
    var index = text.indexOf(".");
    return index == -1 ? 0 : (text.length - index - 1);
}

根据LePatay的解决方案,还要注意科学符号(ex:3.7e-7)和es6语法:

function countDecimals(num) {
  let text = num.toString()
  if (text.indexOf('e-') > -1) {
    let [base, trail] = text.split('e-')
    let elen = parseInt(trail, 10)
    let idx = base.indexOf(".")
    return idx == -1 ? 0 + elen : (base.length - idx - 1) + elen
  }
  let index = text.indexOf(".")
  return index == -1 ? 0 : (text.length - index - 1)
}

我在这个线程中尝试了一些解决方案,但由于遇到了一些限制,我决定在它们的基础上进行构建。下面的版本可以处理:字符串、双精度和整数输入,它还可以忽略应用程序所需的任何不重要的零。因此,0.010000将计为小数点后2位。小数点后15位

  function countDecimals(decimal)
    {
    var num = parseFloat(decimal); // First convert to number to check if whole

    if(Number.isInteger(num) === true)
      {
      return 0;
      }

    var text = num.toString(); // Convert back to string and check for "1e-8" numbers
    
    if(text.indexOf('e-') > -1)
      {
      var [base, trail] = text.split('e-');
      var deg = parseInt(trail, 10);
      return deg;
      }
    else
      {
      var index = text.indexOf(".");
      return text.length - index - 1; // Otherwise use simple string function to count
      }
    }

245.0应该返回什么?请添加一些解释和上下文。这不适用于
value=0.00000005
例如。。。因为
value.toString()
将返回
5e-8
@Mustafa是的,您是对的。我已经根据你的建议更新了我的答案。好的,但只适用于带小数的数字。如果给定的数字是一个整数,这将失败,因为indexOf应该返回-1,结果得到的是数字的计数,而不是零。
function countDecimals(num) {
  let text = num.toString()
  if (text.indexOf('e-') > -1) {
    let [base, trail] = text.split('e-')
    let elen = parseInt(trail, 10)
    let idx = base.indexOf(".")
    return idx == -1 ? 0 + elen : (base.length - idx - 1) + elen
  }
  let index = text.indexOf(".")
  return index == -1 ? 0 : (text.length - index - 1)
}
  function countDecimals(decimal)
    {
    var num = parseFloat(decimal); // First convert to number to check if whole

    if(Number.isInteger(num) === true)
      {
      return 0;
      }

    var text = num.toString(); // Convert back to string and check for "1e-8" numbers
    
    if(text.indexOf('e-') > -1)
      {
      var [base, trail] = text.split('e-');
      var deg = parseInt(trail, 10);
      return deg;
      }
    else
      {
      var index = text.indexOf(".");
      return text.length - index - 1; // Otherwise use simple string function to count
      }
    }