Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的Java数字精度_Javascript_Java_Node.js_Math_Numbers - Fatal编程技术网

Javascript中的Java数字精度

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;

我用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;
        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,这显然小于