如何将js中的var转换为java?

时间:2015-03-12 01:12:45

标签: java javascript numbers

现在我尝试将一些js代码转换为java,有一个问题:

在js

  

46022 * 65535 = 3016051770

     

     

(46022 * 65535)| 7867 = -1278910789

在java中

  

46022 * 65535 = -1278915526这是溢出

     

46022L * 65535L = 3016051770L这与js

的结果相同      

(46022 * 65535)| 7867 = -1278910789这一个和下面的问题是

     

(46022L * 65535L)| 7867L = 3016056507L

那么,为什么|运算符会将两个正数作为nagtive数? 处理int和long时,java和js之间的区别是什么?

然后,在这种情况下如何编写与js兼容的java代码?

注意:我知道int和long的范围,我的问题是|

更多问题:

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators &也是32位操作,然后: 在js

  

2996101485& 65535 = 57709

在java中

  

2996101485溢出到int所以我使用double来存储它并在我需要执行AND时将其强制转换为int。

     

double a = 2996101485l;

     

双b = 65535;

     

int c =(int)a& (int)b;现在c = 65535

但是如果我使用long来施展:

  

长c =(长)a& (长)b;现在c = 57709

因此,只需将double转换为int就会导致问题。我想知道为什么?

我遇到了问题,2996101485可以在js中存在于32位,在java中它应该很长。所以我编写函数来转换那些操作,例如,&应该使用这个java函数在js中运行给出相同的结果:

private double doOR(double x, double y) {
    if (x > Integer.MAX_VALUE && x <= 1l << 32) {
        if (y > Integer.MAX_VALUE && y <= 1l << 32) {
            return (long) x | (long) y;
        } else {
            return (long) x | (int) y;
        }
    } else {
        return (int) x | (int) y;
    }
}

2 个答案:

答案 0 :(得分:2)

您应该使用long代替。

System.out.println(46022L*65535L); // = 3016051770

Java有点内涵和多头。

    System.out.println(Integer.MAX_VALUE);  // = 2147483647
    System.out.println(Long.MAX_VALUE);  // = 9,223,372,036,854,775,807

至于语言差异,我只能将它归因于语言之间的不同精确度。 If you see this question,您会看到JS中最大的数字是9,007,199,254,740,992。这是一个猜测,可能是出于另一个原因。

答案 1 :(得分:2)

问题在于虽然JavaScript have roughly 53-bit precision中的数字(它们似乎基于浮点数加倍),但是bitwise OR operates on only 32 bits

  

按位运算符将其操作数视为32位(零和1)的序列,而不是十进制,十六进制或八进制数。

这意味着在使用算术时,long将为您提供类似JavaScript的算术(使用像你这样的数字),因为Java int会溢出;但是当使用按位操作时,int将获得类似JavaScript的结果,因为这两个平台都在32位数字上运行。