Java和Javascript中相同数字的乘法给出不同的值

时间:2019-03-05 17:48:14

标签: javascript java

我有一个表达式,正在用Java和JavaScript进行评估。

Java

System.out.println(582344008L * 719476260);

Output: 418982688909250080

JavaScript

document.write(582344008 * 719476260)

Output: 418982688909250050

为什么两个值都不同?

2 个答案:

答案 0 :(得分:2)

JavaScript编号都是IEEE 754的两倍,因此这里似乎出现了一些浮点错误。有关更多详细信息,请参见Difference between floats and ints in Javascript?

答案 1 :(得分:2)

序言

@Charlie Wallace 所说

  

582344008 * 719476260大于Number.MAX_SAFE_INTEGER

What is JavaScript's highest integer value that a number can go to without losing precision?
正如** @ baseballlover723
@RealSkeptic 所说,这是精确度/不同存储类型大小floating pointrounding error错误。

请参见javascript types

JavaScript中的7种基本数据类型是什么

JavaScript中有7种基本类型。

  • number表示任意数字:整数或浮点数。整数/十进制值,精度最高为16位。 JavaScript数字都是浮点数,根据IEEE 754标准存储。该标准有几种格式。 JavaScript使用binary64或double precision。顾名思义,数字以64位的二进制格式存储。
  • string用于字符串。字符串可以包含一个或多个字符,没有单独的单字符类型。
  • boolean代表true / false
  • null用于未知值–具有单个值null的独立类型。
  • undefined用于未分配的值–具有单个值undefined的独立类型。
  • object用于更复杂的数据结构。
  • symbol获取唯一标识符。

通过typeof运算符,我们可以查看存储在变量中的类型。

  • 两种形式:typeof xtypeof(x)
  • 返回带有类型名称的字符串,例如"string"
  • 对于null返回"object" –这是语言错误,实际上不是对象。
  • Java中的8种原始数据类型是什么?

        byte     for  8-bit signed integer  
        short    for 16-bit signed integer  
        int      for 32-bit signed integer  
        long     for 64-bit signed integer  
        char     for two bytes in Unicode  
        float    for *decimal* values up to  7 digits of precision   
        double   for *decimal* values up to 16 digits of precision (64 bits)  
        boolean  for true/false  
    
    带有小数部分的

    十进制值称为浮点。它们可以用标准或科学记数法表示。

    测试

    一种快速的测试方法是使用online java compiler(在线编译和执行Java(JDK 1.8.0))

    public class HelloWorld{
    
         public static void main(String []args){
            System.out.println("Long Output: "+582344008L * 719476260L);
            System.out.println("Float Output: "+582344008.0 * 719476260.0);
         }
    }
    

    命令:

    $javac HelloWorld.java
    $java -Xmx128M -Xms16M HelloWorld
    

    输出:

    Long Output: 418982688909250080  
    Float Output: 4.1898268890925005E17
    

    我的桌面计算器转到:

    4.189826889E17
    

    JavaScript online compiler

    //JavaScript-C24.2.0 (SpiderMonkey)
    print("Output: "+582344008 * 719476260)
    

    输出:

    Output: 418982688909250050