Javascript中的Java编号精度

时间:2017-05-18 16:00:46

标签: 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;
        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");
}

结果是:1463925582232863984

现在,我在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);

结果是:1463925582232864000,这个错误,它必须与Java代码相同。

我怎样才能做到这一点?我已经尝试过使用该库(BigNumber),但没有成功。

3 个答案:

答案 0 :(得分:2)

1463925582232864000是最近的64位IEEE-754浮点数到1463925582232863984.Javascript中的数字(目前 - 我相信这是在变化)总是64位IEEE-754浮点数。

基本上,为了做到这一点,你需要一个支持数字类型其他的Javascript库,而不是内置的。(我希望BigNumber可以工作,但是你还没有向我们展示你用它做了什么,所以很难知道你做错了什么。)

答案 1 :(得分:0)

以下是有关原因的一些信息: https://modernweb.com/what-every-javascript-developer-should-know-about-floating-points/

问题在于Javascript的浮点精度。

你总是可以尝试像Math.js这样的另一个库

答案 2 :(得分:0)

经过一些实验,我看到0xB4EEB49B04C0处于IEEE-754 FP十六进制表示中。所以这个答案根本不合适。

1463925582232863984是输入的正确十进制表示形式!

因此,您应该使用支持IEEE-754输入的bignumber库。

IGNORE旧回答

使用BigNumber按预期工作:

var r2 = new BigNumber("B4EEB49B04C0", 16);
console.log(r2.toString());

它输出198937325274304.此外,在线bignumber转换器给出了这个结果。 这使我怀疑Java代码的输出也是错误的。你能否证实“1463925582232863984”是正确的结果?

输入是48位数字,因此它不能大于支持的最大64位数。您的发布结果应等于“1450e88f9298c4f0”作为输入。