我正在尝试在 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;
}));
上面的代码片段将实际表示数字的字符串
:12345
、1.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/