Javascript:如何检索 *string* 数字的小数位数?

IT技术 javascript string numbers decimal
2021-03-04 14:40:32

我有一组带小数的字符串数字,例如:23.456, 9.450, 123.01... 我需要检索每个数字的小数位数,知道它们至少有 1 个小数。

换句话说,该retr_dec()方法应返回以下内容:

retr_dec("23.456") -> 3
retr_dec("9.450")  -> 3
retr_dec("123.01") -> 2

在这种情况下,尾随零确实算作小数,与此相关问题不同

是否有一种简单/交付的方法可以在 Javascript 中实现这一点,还是应该计算小数点位置并计算与字符串长度的差异?谢谢

6个回答
function decimalPlaces(num) {
  var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
  if (!match) { return 0; }
  return Math.max(
       0,
       // Number of digits right of decimal point.
       (match[1] ? match[1].length : 0)
       // Adjust for scientific notation.
       - (match[2] ? +match[2] : 0));
}

额外的复杂性是处理科学记数法

decimalPlaces('.05')
2
decimalPlaces('.5')
1
decimalPlaces('1')
0
decimalPlaces('25e-100')
100
decimalPlaces('2.5e-99')
100
decimalPlaces('.5e1')
0
decimalPlaces('.25e1')
1
不是,我只是想指出''+在这种情况下是不必要的。
2021-04-16 14:40:32
请注意,OP已经声明它不是数字,而是内部带有数字的字符串。
2021-04-20 14:40:32
@Phrogz,我认为这不会影响我的答案的有效性,除了我可能不应该在 \.(\d+) 的末尾计算 0
2021-05-02 14:40:32
@arod,decimalPlaces("1.00") === 2decimalPlaces(1.00) === 0因为("" + 1.00) === "1". 该函数对数字的字符串表示进行操作,而不是原始数值,因为原始数值本质上不是十进制的——IEEE 854 没有将其纳入 EcmaScript 5
2021-05-04 14:40:32
@Phrogz,明白了。谢谢。
2021-05-06 14:40:32
function retr_dec(num) {
  return (num.split('.')[1] || []).length;
}
@Deleteman 幸好指定了 OP knowing that they have at least 1 decimal
2021-04-27 14:40:32
这不适用于以指数表示法打印的非常小的数字。
2021-04-28 14:40:32
这也不适用于某些“国际”数字,其中数字可能是这样写的 3.000,00
2021-04-28 14:40:32
如果数字真的很小,如 0.00000001,则 num.toString() 将返回类似 1e-7 的内容,此代码将不起作用。
2021-05-06 14:40:32
效果很好。在编辑之前,当字符串中没有小数点引用此答案时,评论说不起作用。
2021-05-16 14:40:32
function retr_dec(numStr) {
    var pieces = numStr.split(".");
    return pieces[1].length;
}
如果没有小数,这种情况将引发错误,例如:123
2021-04-27 14:40:32
或者更简单: numStr.split(".")[1].length;
2021-05-03 14:40:32
值得指出的是,如果您的号码不是字符串,这将不起作用。让它工作var pieces = numStr.toString().split(".");
2021-05-05 14:40:32

由于还没有基于正则表达式的答案:

/\d*$/.exec(strNum)[0].length

请注意,这对于整数“失败”,但根据问题规范,它们永远不会发生。

@LarryBattle 我感谢您的评论和全面性,但问题明确指出,“知道他们至少有 1 位小数”如果你因为这个原因否决了我的正确答案,我请你重新考虑你的投票。
2021-04-29 14:40:32

您可以通过这种方式获得数字小数部分的长度:

var value = 192.123123;
stringValue = value.toString();
length = stringValue.split('.')[1].length;

它使数字成为字符串,将字符串一分为二(在小数点处),并返回由拆分操作返回的数组的第二个元素的长度,并将其存储在 'length' 变量中。

OP 表示数字已经是字符串。您的回答没有提供 Jack 和 Daniel Bidulock 尚未建议的任何新内容
2021-04-20 14:40:32
这是迄今为止对 OP 问题最直接的回答。OP 不要求考虑其他符号(八进制?十六进制?)
2021-04-21 14:40:32
注意小数前数字的科学表示。当数字长度为 20 及以上时,它会启动
2021-05-03 14:40:32