これは、数値が小さい場合は単純ですが、「9223372036854775807」のような数値は parseInt() には大きすぎます。
外部クラスを許可していないように見えるGoogle docsスクリプトエディター内でこれを行う方法がわかりません。
これは、数値が小さい場合は単純ですが、「9223372036854775807」のような数値は parseInt() には大きすぎます。
外部クラスを許可していないように見えるGoogle docsスクリプトエディター内でこれを行う方法がわかりません。
ほら、このスクリプトをどこかで使用しましたが、うまくいくようです。その背後にある考え方は、文字列を 8 文字のチャンクに分割し、チャンク/2 を計算し、チャンクを合計して 2 で除算した結果を取得することです。
2 で割ることにより、結果を簡単に計算できます。
var maxIntSize = 8;
function divide2(number, addup, depth) {
var result = "";
var partLength = Math.min(number.length,maxIntSize);
var part = number.substring(0,partLength);
var partNum = parseInt(part,10);
var partAdd = (addup==0)?0:(5*Math.pow(10,partLength-1));
var partRes = Math.floor(partNum/2)+partAdd;
var partRem = partNum%2;
result = result + partRes;
if (depth > 0) {
for (var i=result.length; i < partLength; i++) {
result = "0"+result;
}
}
var nextPart = number.substring(partLength, number.length);
if (partLength < number.length) {
var res = divide2(nextPart, partRem, depth+1);
result = result + res.result;
res.result = result;
return res;
} else {
var res = {result: result, remainder: partRem};
return res;
}
}
function toBinary(number) {
var out = "";
while (number.length > 1 || number != "0") {
var res = divide2(number,0,0);
out = "" + res.remainder + out;
number = res.result;
}
return out;
}
var testNum = "12312312312112312312312312312312312312312312312312312312312312312312312312312312312312312312123";
document.write("bin("+testNum+") = "+toBinary(""+testNum)+"<br/>");
2 による除算を高速に計算するには、チャンクへの除算が必要です。このスクリプトは、膨大な数の場合でも非常に高速に動作します。