在JavaScript中获取float的长度

时间:2017-05-31 22:38:12

标签: javascript math floating-point undefined precision

我试图在JavaScript中获得float的长度,但我无法将其作为string

var length = ((x + '').toString().length;

因为undefined是变量的一个非常规则和可能的值,所以我最终得到"undefined"的长度......

我看到了各种可能的解决方案:

  • 使用float在数组中分配每个number.isFloat()的数字并计算数组的长度。

  • 通过查找数学解决方案:(Math.log10((newValue ^ (newValue >> 31)) - (newValue >> 31)) | 0) + 1,但应用于float值,而不仅仅是整数。

  • 一些循环每个数字的虚拟函数。

  • 使用特定的数学库(http://mathjs.org/),这在我看来是最好的解决方案,因为我无法找到任何能够在不损害性能的情况下执行此任务的工作函数。

2 个答案:

答案 0 :(得分:2)

如果number实际上是数字,那么先检查一下,如果是,则返回其字符串表示的长度:

let numbers = [undefined, null, 12345, 1.2345, '12345', '1.2345', 'abcd', '1.2345abcd', 0.1 + 0.2, 0.3, {}, []]

console.log(numbers.map(number => {
  return number === null || isNaN(number) ? 0 : number.toString().length;
}));

以上代码段认为strings实际代表一个数字:123451.2345 ...作为数字。

它会为0,对象,数组和undefined返回null,但请注意我们需要明确检查null,因为它可能不直观,但{ {1}}将返回isNaN(null)。有关详细说明,请参阅this other answer

如果您不想计算false,您有多种选择:

  • 使用String.prototype.replace()将号码.替换为'.' {/ 1}}。
  • 一旦你知道这个数字实际上是一个数字,检查它是否是''的浮点数,如果是,则从string中减去number % 1 !== 0

你提到你认为1可能是避免损害性能的最佳选择,但是一个自定义实现可以完全满足您的需要,这可能比一个完整的库可以更快地处理“数学”

此外,你应该看看这个:https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil

无论如何,在你的自定义实现中你应该考虑其他一些特殊情况,如果你认为库可能已经正确处理,显然需要一些额外的工作。您是否根据我的代码注意到.length的长度是多少? 19!为什么?看起来很明显0.1 + 0.2是0.3,所以它的长度应该是3.实际上,列表中的下一个项目是mathjs,它适用于那个。

嗯,事实证明浮点数有一些精度问题。我现在不打算进入,但你可以在这里阅读:https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems

在这里你可以看到一个例子:

0.1 + 0.2

答案 1 :(得分:1)

要查找浮点数的长度而不遇到未定义的问题,请使用try,catch和throw。

var num = document.getElementById("num").value;
  var result = document.getElementById("result").value;
var parsedFloat;

function foo() {
  num = document.getElementById("num").value;
  result = document.getElementById("result").value;

  try {
    if (num == parseFloat(num) && num !== undefined) { // if number is equal to that number turned into a float; "1.2" becomes 1.2 and "thiswontwork" becomes NaN (not a number)
      parsedFloat = num;
      if (parsedFloat != parseInt(parsedFloat)) { // if it's a float, not an integer
        parsedFloat = parsedFloat.substring(1); // removes the last digit so that the length will be subtracted because of decimal point
      } // currently, I do not have anything for ".0".
      result = parsedFloat.length;
    } else {
      throw "Must be a number!";
    }
  } catch(err) {
    result = err;
  } finally {
    document.getElementById("result").value = result;
  }
}
<input id="num" placeholder="insert number here"><br>
<input id="result" placeholder="result">
<br>
<button onclick="foo()">Click me!</button>