我有简单的函数来计算小数位数,
例如。 _d(0.01) = 2
,_d(0.001) = 3
等等。
我们在系统中添加了一些新硬币,其数量为0.00000001且功能已损坏。
原因如下:
0.00000001.toString() = 1e-8
,所以我不能把它分成'.'
并按照我之前的计算来计算第二部分的长度。
所以问题是 - 如何从'0.00000001'
数字最简单的方式获取字符串0.00000001
。
修改
我的意思并不是'0.00000001'
,我的意思是任何微米级到十进制而没有exp。一些可以_d(x)
起作用的函数_d(0.000000000012) = '0.000000000012'
,依此类推。通常toString()
对较大(但不是太大)的数字做什么。
答案 0 :(得分:4)
使用具有大量数字的toFixed()
,然后计算小数点后的零数。
function _d(num) {
var str = num.toFixed(100);
var fraction = str.split('.')[1];
var zeros = fraction.match(/^0*/)[0].length;
return zeros + 1;
}
console.log(_d(0.1));
console.log(_d(0.01));
console.log(_d(0.000000001));
答案 1 :(得分:2)
你想要这样的事吗
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));
}
console.log(decimalPlaces(0.000000001))
答案 2 :(得分:1)
首先,我从这里得到了一些灵感: How to avoid scientific notation for large numbers in JavaScript?
您可以将数字转换为强数字,然后检查str.indexOf(" e")。如果为true,则返回字符串的科学记数部分。例如:
function _d() {
// your current function here
if (str.indexOf("e")) {
var something = str.split("-")[1];
return something;
}
}
编辑:我在你最后一次评论之前就是在做这个,所以这会返回一个数字的字符串,我认为这就是你想要的。
暂且不谈有效数字,这是有意义和正确的,但不能解决您的问题,请尝试这一点。我们取数字,转换为字符串,如果该字符串不是科学记数法,那么答案是微不足道的。如果它是科学记数法,那么将字符串拆分两次(一次打开" e - "然后将第0个数组拆分为"。"将str [1] -1个零添加到数字的前导并将数字添加到结尾。
function _d(arg) {
var str = arg.toString();
if (str.indexOf("e-")) {
var digits = str.split("e-")[0];
var zeroes = str.split("e-")[1];
var zero = Number(zeroes);
var each = digits.split(".");
var something = "0.";
for (var i = 0; i < zeroes-1; i++) {
something += "0";
}
for (var j = 0; j < each.length; j++) {
something = something + each[j];
}
return something;
}
}
这不会使用非常大的数字或非常小的负数。它非常复杂。
答案 3 :(得分:0)
答案 4 :(得分:0)
另一种方法是使用.toString()
,然后查找.length-2
(2个字符 - &#39; 0。&#39;。它应该为您提供零个数。
此方法的优点是您无需知道数字中的最大小数位数。