21

特定のべき乗の整数値を作成する必要があります (これは正しい用語ではありませんが、基本的には 10、100、1000 などを作成する必要があります)。「べき乗」は関数パラメーターとして指定されます。私は解決策を思いつきましたが、MANはそれがハックで間違っていると感じています. より良い方法があれば、おそらく文字列ベースではない方法を学びたいですか? また、 eval() はオプションではありません。

現時点で私が持っているものは次のとおりです。

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

    return parseFloat(numToParse);
}

また、この非文字列ベースのソリューションを思いついたばかりですが、ループのためにハッキーなようです:

function a(precision)
{
    var tmp = 10;
    for(var i = 1; i < precision; i++)
    {
        tmp *= 10;
    }

    return tmp;
}

ところで、通貨を扱うための丸め方法を作成するためにこれを行う必要がありました。私は varformated = 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;
    }  
}

すでに便利であることが証明されているので、これをここに含めると思いました。

4

7 に答える 7

49

ES5 以前では、次を使用しますMath.pow

var result = Math.pow(10, precision);

var precision = 5;
var result = Math.pow(10, precision);
console.log(result);

ES2016 以降では、指数演算子を使用します。

let result = 10 ** precision;

let precision = 5;
let result = 10 ** precision;
console.log(result);

于 2011-06-08T23:51:21.170 に答える
3

なぜだめですか:

function precision(x) {  
  return Math.pow(10, x);
}
于 2011-06-08T23:52:05.210 に答える
3

これはあなたの関数と同じ結果になりますが、私はまだアプリケーション/意図を理解していません。

function makeMultiplierBase(precision,base){
    return Math.pow(base||10,precision);
}
于 2011-06-08T23:52:07.943 に答える
3

あなたがする必要があるのが10を異なるパワーに上げること、または任意のベースを任意のパワーに上げることだけである場合Math.pow(10,power);、ホイールを再発明する理由が特に必要でない限り、ビルトインを使用しないのはなぜですか?

于 2011-06-08T23:54:00.737 に答える
2

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;
};

: クロージャ ライブラリのバグはその後修正さました。

于 2014-03-26T09:13:49.947 に答える
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 で使用される 2 つの 10 進表記があります。"-" ] 桁 + [ "." digit+ ] と指数表記 [ "+" | "-" ] 数字 [ "." 数字+ ] "e" [ "+" | "-" ] digit+ 指数表記の例は -1.37e+2 です。出力の場合、ポイントの前に常に正確に 1 桁があり、入力の場合は複数の桁を使用できます。指数表記は次のように解釈され ます。その数値の値は 仮数× 10指数です。したがって、-1.37e+2 は数値 -137 を表します。

于 2016-06-29T12:28:39.617 に答える
-1

ルックアップ テーブルを使用します。しかし、これが通貨金額を丸めるためのものである場合は、schemozzle 全体ではなく BigDecimal を使用する必要があります。

于 2011-10-18T01:55:51.180 に答える