javascript - 在 JavaScript 中获取 float 的长度

标签 javascript math floating-point undefined precision

我正在尝试在 JavaScript 中获取 float 的长度,但我无法使其作为 string 工作:

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

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

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

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

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

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

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

最佳答案

首先检查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;
}));

上面的代码片段将实际表示数字的字符串:123451.2345...视为数字。

对于未定义、对象、数组和null,它将返回0,但请注意,我们需要显式检查null 因为它可能不直观,但 isNaN(null) 将返回 false。请参阅this other answer详细解释。

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

  • 使用 String.prototype.replace() 将数字的 string 表示形式中的 '.' 替换为 '' .
  • 一旦您知道该数字实际上是一个数字,请检查它是否是一个 float ,执行 number % 1 !== 0 ,如果是,则减去 1来自其.length

您提到您认为 mathjs 可能是避免损害性能的最佳选择,但是完全满足您需要的自定义实现可能比完整的放大库来处理“数学”更快“一般来说。

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

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

事实证明 float 存在一些精度问题。我现在不打算讨论这个问题,但您可以在这里阅读:https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems .

在这里您可以看到一个示例:

console.log(0.1, 0.2, 0.3, 0.1 + 0.2)

关于javascript - 在 JavaScript 中获取 float 的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44295751/

相关文章:

javascript - 创建bunyan子记录器时的路径问题

Javascript 等待 iframe 重新加载

javascript - 根据曲线/方程/公式修改滚动持续时间

math - 在一点处分割三次贝塞尔曲线

java - 如何 HALF_DOWN 浮点值,例如将 4.8 转换为 4.5?

C++:如何在不进行舍入、截断或填充的情况下将 float 转换为字符串?

JavaScript:查找数字正则表达式匹配

javascript - 通过 Graph API 更新 Facebook 应用程序设置

java - Android Expj4 检查表达式是否无效

c++ - 如何加快 float 到整数的转换?