1

与えられた数の5つの連続した数の最大の積を計算するコードを書こうとしています。
私が持っているコードは、数値を配列に変換してから、配列をforループし、5つの連続する1桁の数値ごとに乗算し、最後の数値と比較しようとします。
関数を通過する数値が21桁を超えると、コンピューターがその数値を科学的記数法に変換し、関数全体が失われると思います。
21桁で正常に実行されるコードは次のとおりです。

function func(value){
    var number = value;
    console.log(number);
    var output = [];
    sNumber = number.toString();
    console.log(sNumber);
    for (var i = 0; i < sNumber.length; i++) {
        output.push(+sNumber.charAt(i));
    }
    console.log(output);
    var productToCompare;
    var largerProduct = 0;
    for (var j = 0; j < output.length - 4; j++) {
        productToCompare = output[j]*output[j+1]*output[j+2]*output[j+3]*output[j+4];
        console.log(productToCompare);
        if (productToCompare > largerProduct) {
            largerProduct = productToCompare;
        }
    }
    return largerProduct;
}

func(13245678901234567890);

別の数字を追加するとすぐに:

func(123465789012345678901);

科学的記数法の使用を開始します。
これは、Javascriptの性質、使用しているコンピューター、コンパイラー、または何によるものですか?

4

1 に答える 1

2

多くの場合と同様に、JavaScript で使用される基本的なデータ型の制限に直面することになります。この場合は整数型の制限のようです。

数値 13245678901234567890 は 64 ビット整数に収まります。別の数字を追加すると、その方法では表現できない範囲に押し込まれるため、浮動小数点数が必要になります。

これを異なる JavaScript エンジンでテストすると、異なる値が得られる場合があります。2147483648 を超えるものは、浮動小数点値としてキャストされる可能性があります。

数学的計算を行っているときはいつでも、文字列計算を行わないようにしてください。数値の文字列表現はかなり恣意的であり、信頼できません。

あなたがしなければならないことは、10 の因数で割り、モジュロ 10 を実行して個々の数字を取得することです。

于 2013-02-20T06:38:06.883 に答える