web-dev-qa-db-ja.com

int64を解析するJavascript

JavaScriptで丸めずに、長整数(文字列として)をJavascriptで数値形式に変換するにはどうすればよいですか?

var ThisInt = '9223372036854775808'
alert(ThisInt+'\r' +parseFloat(ThisInt).toString()+'\r' +parseInt(ThisInt).toString());

文字列としてキャストする前に加算を実行する必要があり、可能な限り2つにスライスする必要はありません。

17
Oppdal

AllNumbers Javascriptでは64ビットの「倍精度」精度 IEE754 浮動小数点です。

したがって、正確に表すことができる最大の正の整数は2 ^ 53-1です。残りのビットは、指数用に予約されています。

あなたの数はそれより正確に1024倍大きいので、小数点以下3桁の精度が失われます。これ以上正確に表現することはできません。

ES6では、Number.isSafeInteger( # )を使用して数値をテストし、安全な範囲内にあるかどうかを確認できます。

var ThisInt = '9223372036854775808'; 
console.log( Number.isSafeInteger( parseInt( ThisInt ) ) );

BigInteger ライブラリも利用可能ですが、これは役立つはずであり、すべての文字列やビットを自分でいじる必要はありません。

EDIT 2018/12ネイティブのBigIntクラス(および新しいリテラル構文)がChrome =およびNodeJS。

29
Alnitak

再帰の助けを少し借りれば、64ビット以上の数値を表す10進文字列を直接インクリメントできます...

/**
 * Increment a decimal by 1
 *
 * @param {String} n The decimal string
 * @return The incremented value
 */
function increment(n) {
    var lastChar = parseInt(n.charAt(n.length - 1)),
        firstPart = n.substr(0, n.length - 1);

    return lastChar < 9
        ? firstPart + (lastChar + 1)
        : firstPart
            ? increment(firstPart) + "0"
            : "10";
}
1
Ates Goral

標準のJavascriptではこれを行うことはできません。しかし、いつものように、私たちを助けるための気の利いた小さなライブラリがあります。この場合は BigInt.js で、任意精度の整数を使用できます。

1
fresskoma