Javascript中的Java数字精度
我用Java编写了以下代码,将十六进制值转换为长数字,在示例中我使用了值:“B4EEB49B04C0”Javascript中的Java数字精度,javascript,java,node.js,math,numbers,Javascript,Java,Node.js,Math,Numbers,我用Java编写了以下代码,将十六进制值转换为长数字,在示例中我使用了值:“B4EEB49B04C0” public static long HexStr2Long(String value) { value = value.toUpperCase(); long result = 0; for (int i = 0; i < value.length(); i++) { int x = value.length() - i - 1;
public static long HexStr2Long(String value)
{
value = value.toUpperCase();
long result = 0;
for (int i = 0; i < value.length(); i++)
{
int x = value.length() - i - 1;
char ch = value.charAt(i);
result += keys.indexOf(ch) * Pow(exponent, x);
}
return result;
}
public static long Pow(long baseNo, long x)
{
long value = 1;
while (x > 0)
{
value = value * baseNo;
x--;
}
return value;
}
public static void main(String[] args) {
long result = HexStr2Long("B4EEB49B04C0");
System.out.print("resultado: "+result+"\n");
}
公共静态长HexStr2Long(字符串值)
{
value=value.toUpperCase();
长结果=0;
对于(int i=0;i0)
{
值=值*baseNo;
x--;
}
返回值;
}
公共静态void main(字符串[]args){
长结果=HexStr2Long(“B4EEB49B04C0”);
系统输出打印(“resultado:+result+”\n);
}
结果是:146392558232863984
现在,我用Javascript创建了等效代码:
pow = function(baseNo, x){
var value = 1;
while(x > 0){
value = value * baseNo;
x--;
}
return value;
}
hexStr2Long = function(val){
var keys = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var exponent = keys.length;
val = val.toUpperCase();
var result = 0;
for (var i = 0; i < val.length; i++) {
var x = val.length - i - 1;
var ch = val.charAt(i);
result += keys.indexOf(ch) * Math.pow(exponent, x);
}
return result;
}
var r = hexStr2Long(wifimac);
console.log('Result: '+r);
pow=函数(baseNo,x){
var值=1;
而(x>0){
值=值*baseNo;
x--;
}
返回值;
}
hexStr2Long=函数(val){
var keys=“0123456789abcdefghijklmnopqrstuvxyz”;
var指数=keys.length;
val=val.toUpperCase();
var结果=0;
对于(变量i=0;i
结果是:1463925582326000,这是错误的,它必须与Java代码相同
我怎样才能做到这一点?我已经尝试使用库(),但没有成功。14639255822232864000是最接近14639255822232863984的64位IEEE-754浮点数。Javascript中的数字(目前-我相信这正在改变)总是64位IEEE-754浮点数字
基本上,为了做到这一点,您需要一个Javascript库,它支持内置类型以外的数字类型。(我希望BigNumber可以工作,但您还没有向我们展示您使用它的尝试,因此很难知道您做错了什么。)14639255822232864000是最接近14639255822232863984的64位IEEE-754浮点数。Javascript中的数字(目前-我相信这正在改变)总是64位IEEE-754浮点数字
基本上,为了做到这一点,您需要一个Javascript库,它支持内置类型以外的数字类型。(我希望BigNumber能起作用,但你还没有向我们展示你用它做了什么,所以很难知道你做错了什么。)以下是一些关于原因的信息: 问题在于Javascript的浮点精度
您可以尝试另一个库,如Math.js以下是一些关于原因的信息: 问题在于Javascript的浮点精度
您可以尝试另一个库,如Math.js经过一些实验后,我看到0xB4EEB49B04C0采用IEEE-754 FP十六进制表示。所以这个答案根本不合适 14639255822232863984是输入的正确十进制表示法 因此,您应该使用支持IEEE-754输入的bignumber库 忽略旧答案 使用BigNumber的效果与预期一样:
var r2 = new BigNumber("B4EEB49B04C0", 16);
console.log(r2.toString());
它输出198937325274304。在线bignumber转换器也给出了这个结果。
这使我怀疑Java代码的输出也是错误的。您能否验证“14639255822232863984”是正确的结果
输入是48位数字,因此不能大于支持的最大64位数字。您发布的结果应该等于“1450e88f9298c4f0”作为输入。经过一些实验后,我看到0xB4EEB49B04C0采用IEEE-754 FP十六进制表示。所以这个答案根本不合适 14639255822232863984是输入的正确十进制表示法 因此,您应该使用支持IEEE-754输入的bignumber库 忽略旧答案 使用BigNumber的效果与预期一样:
var r2 = new BigNumber("B4EEB49B04C0", 16);
console.log(r2.toString());
它输出198937325274304。在线bignumber转换器也给出了这个结果。
这使我怀疑Java代码的输出也是错误的。您能否验证“14639255822232863984”是正确的结果
输入是48位数字,因此不能大于支持的最大64位数字。您发布的结果应等于“1450e88f9298c4f0”作为输入。这不会解决您的问题,但您没有调用您定义的pow函数,而是调用Math.pow是的,我知道。结果是一样的。@Andreas我在下面的(错误)答案中遇到了同样的错误。如果你将十六进制数解释为IEEE-754 FP数,它会精确地生成14639255822232863984。这不会解决你的问题,但你不是在调用你定义的pow函数,而是在调用Math.pow。是的,我知道。结果是一样的。@Andreas我在下面的(错误)答案中遇到了同样的错误。如果您将十六进制数解释为IEEE-754 FP数,那么它的结果正好是14639255822232863984。谢谢您的回答。结果“14639255822232863984”是正确的。Java代码来自一家GPS公司,他们给了我将Mac地址转换为数字的代码,因为我使用的是NodeJS,我想用Javascript转换Java代码。支持的最大整数是9007199254740991,这显然小于您的结果值。但是您的输入适合48位,因此结果不能大于MAX_INT imo。@FrankSchmid:不,支持的整数值要大得多。9007199254740991(
Number.MAX_SAFE_INTEGER
)是您可以添加1并获得下一个连续整数的最大整数。感谢您的回答。结果“14639255822232863984”是正确的。Java代码来自一家GPS公司,他们给了我将Mac地址转换为数字的代码,因为我使用的是NodeJS,所以我想用Javascript转换Java代码。支持的最大整数是9007199254740991,这显然小于