我需要为特定功率创建一个整数值(这不是正确的术语,但基本上我需要创建10,100,1000等)。“power”将被指定为函数参数。我提出了一个解决方案,但是MAN确实感到hacky和错误。我想学习更好的方法,如果有一个,也许一个不是基于字符串的?此外,eval()不是一个选项。
这是我现在所拥有的:
function makeMultiplierBase(precision)
{
var numToParse = '1';
for(var i = 0; i < precision; i++)
{
numToParse += '0';
}
return parseFloat(numToParse);
}
我也想出了这个基于非字符串的解决方案,但由于循环仍然看起来很hacky:
function a(precision)
{
var tmp = 10;
for(var i = 1; i < precision; i++)
{
tmp *= 10;
}
return tmp;
}
顺便说一句,我需要这样做才能创建一种使用货币的舍入方法。我一直在用
var formatted = Math.round(value * 100)/ 100
但是这个代码遍布整个地方,我希望有一个方法来处理特定精度的舍入,所以我创建了这个
if(!Math.roundToPrecision)
{
Math.roundToPrecision = function(value, precision)
{
Guard.NotNull(value, 'value');
b = Math.pow(10, precision);
return Math.round(value * b) / b;
}
}
以为我会把它包含在这里,因为它已被证明是非常方便的。
答案 0 :(得分:38)
在ES5及更早版本中,请使用Math.pow
:
var result = Math.pow(10, precision);
var precision = 5;
var result = Math.pow(10, precision);
console.log(result);
在ES2016及更高版本中,请使用exponentiation operator:
let result = 10 ** precision;
let precision = 5;
let result = 10 ** precision;
console.log(result);
答案 1 :(得分:3)
为什么不:
function precision(x) {
return Math.pow(10, x);
}
答案 2 :(得分:3)
这与你的功能有相同的结果,但我仍然不理解应用程序/意图。
function makeMultiplierBase(precision,base){
return Math.pow(base||10,precision);
}
答案 3 :(得分:3)
如果您需要做的只是将10提升到不同的功率,或任何基础到任何功率,为什么不使用内置的Math.pow(10,power);
,除非您特别需要有理由重新发明轮子
答案 4 :(得分:1)
对于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中遇到的日常问题,但在某些情况下可能会非常麻烦,特别是对于比较运算符。一个例子是来自Closure Library的Google log10Floor()
函数:
/**
* 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;
};
如果您将10的幂超过10³³,则此函数可能会返回错误的结果,因为Math.pow(10, 33) > 1e33
的计算结果为true
。我解决这个问题的方法是使用数字强制,将指数连接到'1e':
+'1e33' //-> 1e+33
+'1e34' //-> 1e+34
+'1e35' //-> 1e+35
+'1e36' //-> 1e+36
+'1e37' //-> 1e+37
并修复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;
};
注意:封闭库中的错误一直是fixed。
答案 5 :(得分:0)
我在通过https://github.com/aecostas/huffman时偶然发现了一些事情。编译后的代码(js)有一行
alphabet_next = sorted.slice(0, +(sorted.length - 1 - groupsize) + 1 || 9e9);
如果您尝试评估9e9(在节点和浏览器控制台上),它会为您提供9000000000,即“9 * 10 ^ 9”。基于此,您只需执行以下操作即可获得10次幂。
var n = 2;
eval("1e"+n); //outputs 100
编辑:更多关于指数表示法 http://www.2ality.com/2012/03/displaying-numbers.html
JavaScript使用两种十进制表示法:固定表示法 [“+”| “ - ”]数字+ [“。”数字+] 和指数表示法 [“+”| “-“ ] 数字 [ ”。”数字+]“e”[“+”| “ - ”]数字+ 指数表示法的示例是-1.37e + 2。对于输出,在该点之前始终只有一个数字,对于输入,您可以使用多个数字。指数表示法解释如下:给定指数表示法中的数字: 有效指数。 该数字的值是 有效数×10 指数。 因此,-1.37e + 2表示数字-137。
答案 6 :(得分:-1)
使用查找表。但如果这是用于舍入货币金额,您应该使用BigDecimal而不是整个schemozzle。