在javascript中将10提高到1倍,还有比这更好的方法吗

在javascript中将10提高到1倍,还有比这更好的方法吗,javascript,exponentiation,Javascript,Exponentiation,我需要创建一个特定幂的整数值(这不是正确的术语,但基本上我需要创建10、100、1000等等),“幂”将被指定为函数参数。我想出了一个解决办法,但老兄,这确实让人觉得不对劲。我想学习一种更好的方法,如果有,也许是一种不是基于字符串的?此外,eval()不是一个选项 以下是我目前的情况: function makeMultiplierBase(precision) { var numToParse = '1'; for(var i = 0; i < precision; i+

我需要创建一个特定幂的整数值(这不是正确的术语,但基本上我需要创建10、100、1000等等),“幂”将被指定为函数参数。我想出了一个解决办法,但老兄,这确实让人觉得不对劲。我想学习一种更好的方法,如果有,也许是一种不是基于字符串的?此外,eval()不是一个选项

以下是我目前的情况:

function makeMultiplierBase(precision)
{
    var numToParse = '1';
    for(var i = 0; i < precision; i++)
    {
        numToParse += '0';
    }

    return parseFloat(numToParse);
}

我想我应该把它包括在这里,因为它已经被证明很方便了。

在ES5和更早的版本中,使用
Math.pow

var result = Math.pow(10, precision);
var精度=5;
var结果=数学功率(10,精度);
控制台日志(结果)为什么不:

function precision(x) {  
  return Math.pow(10, x);
}

这与您的函数具有相同的结果,但我仍然不理解应用程序/意图

function makeMultiplierBase(precision,base){
    return Math.pow(base||10,precision);
}

如果你所需要做的只是将10提升到不同的能力,或者任何能力的基础,为什么不使用内置的
Math.pow(10,能力)除非您有特定于soe的理由重新发明轮子,否则请使用查找表。但如果这是为了对货币金额进行舍入,则应使用BigDecimal而不是整个schemozzle。

对于10或以上的幂,
Math.pow()
可能会失去精度。例如:

Math.pow(10, 33);    //-> 1.0000000000000001e+33
Math.pow(10, 34);    //-> 1.0000000000000001e+34
Math.pow(10, 35);    //-> 1e+35
Math.pow(10, 36);    //-> 1e+36
Math.pow(10, 37);    //-> 1.0000000000000001e+37
虽然这不是JavaScript中可能遇到的日常问题,但在某些情况下,尤其是使用比较运算符时,它可能会非常麻烦。一个例子是来自闭包库的Google函数:

/**
 * Returns the precise value of floor(log10(num)).
 * Simpler implementations didn't work because of floating point rounding
 * errors. For example
 * <ul>
 * <li>Math.floor(Math.log(num) / Math.LN10) is off by one for num == 1e+3.
 * <li>Math.floor(Math.log(num) * Math.LOG10E) is off by one for num == 1e+15.
 * <li>Math.floor(Math.log10(num)) is off by one for num == 1e+15 - 1.
 * </ul>
 * @param {number} num A floating point number.
 * @return {number} Its logarithm to base 10 rounded down to the nearest
 *     integer if num > 0. -Infinity if num == 0. NaN if num < 0.
 */
goog.math.log10Floor = function(num) {
  if (num > 0) {
    var x = Math.round(Math.log(num) * Math.LOG10E);
    return x - (Math.pow(10, x) > num);
  }
  return num == 0 ? -Infinity : NaN;
};
以及,修复
log10Floor()
功能:

goog.math.log10Floor = function(num) {
  if (num > 0) {
    var x = Math.round(Math.log(num) * Math.LOG10E);
    return x - (+('1e' + x) > num);
  }
  return num == 0 ? -Infinity : NaN;
};

注意:闭包库中的错误一直存在。

我只是在浏览过程中偶然发现了一些东西。编译代码(js)有一行

alphabet_next = sorted.slice(0, +(sorted.length - 1 - groupsize) + 1 || 9e9);
如果您尝试评估9e9(在节点和浏览器控制台上),它将为您提供900000000,即“9*10^9”。基于此,您只需执行以下操作即可获得第10次幂。

var n=2;
评估(“1e”+n)//产出100

编辑:有关指数表示法的更多信息,请访问

JavaScript使用两种十进制表示法:固定表示法 [“+”|“-”]位+[“”位+] 和指数表示法 [“+”|“-”]位[“+”位+]“e”[“+”|“-”]位+ 指数表示法的一个例子是-1.37e+2。对于输出,点前始终只有一个数字,对于输入,可以使用多个数字。指数表示法解释如下:给定指数表示法中的数字: 有效位e指数。 该数字的值为 有效位×10指数。 因此,-1.37e+2表示数字−137


那么,为什么要将其设置为浮点而不是整数?@Shad您指的是parseFloat()调用?如果是这样,我想这只是一个疏忽,数字(numToParse)会起作用,为什么不直接
返回Math.pow(base | 10,precision)
@davin True,只是一个初始化习惯=)遗憾的是,我不知道pow()方法,这正是我需要的。然而,我仍然想知道它是如何做到的;知道Math.pow()在封面后面可能在做什么吗?@Steve,和大多数数学库一样,它们可能实现具有标准要求精度的函数数值近似。由于
Math.pow
不仅仅适用于整数,它的实现必须是所有“实数”的通用实现,因此它与您的循环实现不同(例如,在5.672的基础上不起作用);也许是泰勒展开式或类似的东西。@Davin-我在谷歌上搜索了“泰勒展开式”,当我读到维基百科的第一段时,当我的视力模糊时,血液开始从我的耳朵里流出来。。。我承认数学是很酷的;0)@Steve,嗯,所以你可以把方程改写如下:我们想要的是
y=x^n
,所以我们写
ln(y)=ln(x^n)=n*ln(x)
,然后把两边都提高到自然基的幂
e
我们得到
y=exp(n*ln(x))
,现在你可以计算
ln(x)
在预定的步数内,泰勒展开到任何所需的精度,乘以
n
,然后计算产品的
exp
函数,再次泰勒展开到所需的项数,即所需的精度。@Steve,是的,这些维基文章的写作目的是让我们都觉得自己很傻(译者注:),或者让他们的作者觉得自己很聪明。在任何情况下,如果你拿起一本关于真实分析的教科书,它们应该是足够的材料来理解泰勒展开到相当深的程度,尽管耳朵的血液症状可能会回来。
+'1e33'    //-> 1e+33
+'1e34'    //-> 1e+34
+'1e35'    //-> 1e+35
+'1e36'    //-> 1e+36
+'1e37'    //-> 1e+37
goog.math.log10Floor = function(num) {
  if (num > 0) {
    var x = Math.round(Math.log(num) * Math.LOG10E);
    return x - (+('1e' + x) > num);
  }
  return num == 0 ? -Infinity : NaN;
};
alphabet_next = sorted.slice(0, +(sorted.length - 1 - groupsize) + 1 || 9e9);