1

文字列を取得して数値に変換し、その数値を base16 に変換してから、文字列に戻そうとしています。

これが私がこれまでに持っているものです:

var d:String = convertBase("123487032174829820348320429437483266812812");

function convertBase(inputInBase10:String):String
{
    var i = Number(inputInBase10);
    var u = i.toString(16);
    trace("i = " + i);
    trace("u = " + u);
    return dest;
}

そして、ここに何が印刷されます:

i = 1.23487032174829e+41
u = 16ae5514d07e12000000000000000000000

私はuずっと埋めようとしています。それよりも大きな数字であることはわかっています。

4

2 に答える 2

3

IEEE-754 倍精度浮動小数点としての数値には、値を正確に表す精度がありません。ただし、ほぼ近いです。

as3cryptoなどのBigInteger実装や、任意の長さを有効にする実装があります。

as3crypto の BigIntegertoRadix()fromRadix()メソッドを調べると、以下が生成されます。

    decimal: 123487032174829820348320429437483266812812
hexadecimal: 16ae5514d07e120126dfbcb3073fddb2b8c

例:

import com.hurlant.math.BigInteger;

var n:BigInteger = new BigInteger();

n.fromRadix("123487032174829820348320429437483266812812", 10);
trace(n.toRadix(16));
trace(n.toRadix(10));
于 2013-04-06T03:04:25.170 に答える
1

これは最も効率的な解決策ではありませんが、数字がそれほど長くないことを考えると実行可能です (非常に長いと小数点以下の桁数が数千になることを意味します)。以下のアルゴリズムは、文字列を使用して長い除算を実装して長い数値を記録し、前の除算の結果を 16 で除算し、剰余を結果に記録します。これにより、問題の解決策が得られます。

以下のコードは JavaScript で書かれています (申し訳ありませんが、私はこのマシンに AS コンパイラを持っていません)、適切な型タグを追加するだけでより AS に見えるようにするのは簡単です:

var source = "123487032174829820348320429437483266812812";

function longDivision(divident, quotient) {
    var i, digits = [], dividentPart = 0, resultDigits = [], nextDigit;
    for (i = 0; i < divident.length; i++) {
        digits[i] = parseInt(divident[i], 10);
    }
    i = 0;
    do {
        dividentPart = dividentPart * 10 + digits[i];
        if (dividentPart >= quotient) {
            nextDigit = (dividentPart / quotient) | 0;
            resultDigits.push(nextDigit);
            dividentPart = dividentPart - nextDigit * quotient;
        } else if (resultDigits.length) {
            resultDigits.push(0);
        }
        i++;
    } while (i < digits.length);
    return { a: resultDigits.join(""), b: dividentPart };
}

function decimalToHex(input) {
    var result = "", div;
    do {
        div = longDivision(input, 16);
        result = div.b.toString(16) + result;
        input = div.a;
    } while (input);
    if (!result) result = "0";
    return "0x" + result;
}

decimalToHex(source);
// '0x16ae5514d07e120126dfbcb3073fddb2b8c'
于 2013-04-06T11:48:27.103 に答える