【问题标题】:AS3 convert big number to base16 numberAS3将大数转换为base16数
【发布时间】:2013-03-28 13:54:40
【问题描述】:

我想取一个字符串,把它变成一个数字,把那个数字变成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 一直填写。我知道这是一个更大的数字。

【问题讨论】:

  • u 十进制是123487032174829820261288993992996781293568。
  • 好的。不过,我试图让你进入 base16,但它用 0 替换重要信息

标签: actionscript-3 hex type-conversion


【解决方案1】:

作为 IEEE-754 双精度浮点数的数字没有准确表示您的值的精度;但是,差不多。

有BigInteger 实现,例如as3crypto,以及其他支持任意长度的实现。

检查 as3crypto 的 BigInteger toRadix() 和 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));

【讨论】:

    【解决方案2】:

    请注意,这不是最有效的解决方案,但可行,因为您的数字不会很长(很长意味着数千个小数位)。下面的算法实现了长除法,使用字符串记录长数,然后将前一次除法的结果反复除以 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-18
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多