JavaScriptで丸めずに長整数(文字列として)をJavascriptで数値形式に変換するにはどうすればよいですか?
var ThisInt = '9223372036854775808'
alert(ThisInt+'\r' +parseFloat(ThisInt).toString()+'\r' +parseInt(ThisInt).toString());
文字列としてキャストバックする前に加算を実行する必要があり、可能な限り2つスライスする必要はありません。
JavaScriptで丸めずに長整数(文字列として)をJavascriptで数値形式に変換するにはどうすればよいですか?
var ThisInt = '9223372036854775808'
alert(ThisInt+'\r' +parseFloat(ThisInt).toString()+'\r' +parseInt(ThisInt).toString());
文字列としてキャストバックする前に加算を実行する必要があり、可能な限り2つスライスする必要はありません。
Javascriptのすべての 数値は、64ビットの「倍精度」IEE754浮動小数点です。
したがって、正確に表すことができる最大の正の整数は2^53-1です。残りのビットは指数用に予約されています。
あなたの数はそれより正確に1024倍大きいので、小数点以下3桁の精度が失われます。これ以上正確に表現することはできません。
ES6ではNumber.isSafeInteger( # )、数値をテストして、安全な範囲内にあるかどうかを確認できます。
var ThisInt = '9223372036854775808';
console.log( Number.isSafeInteger( parseInt( ThisInt ) ) );
ただし、 BigIntegerライブラリも利用できるので、すべての文字列やビットを自分でいじる必要がなくなります。
編集2018/12ChromeとNodeJSにネイティブBigIntクラス(および新しいリテラル構文)が追加されました。
再帰の助けを少し借りれば、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";
}
標準のJavascriptではこれを行うことはできません。しかし、いつものように、私たちを助けるための気の利いた小さなライブラリがあります。この場合はBigInt.jsで、任意精度の整数を使用できます。
Numberクラスを使ってみましたか?
var num = new Number(parseFloat(ThisInt))
これには、Intまたはfloatの代わりにNumber(ThisInt)を使用してください。