我正在尝试取一个字符串,将其转换为数字,将该数字转换为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
一直填写。我知道这个数字比那个更大。
答案 0 :(得分:3)
作为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));
答案 1 :(得分:1)
请注意,这不是最有效的解决方案,但可行,因为您的数字不会很长(很长会意味着数千位小数)。下面的算法使用字符串来实现长除法以记录长数,然后重复地将前一除法的结果除以16,同时将余数记录到结果中。这为您提供了问题的解决方案。
下面的代码是用JavaScript编写的(对不起,我在这台机器上没有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'