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