我有一个表达式,正在用Java和JavaScript进行评估。
Java
System.out.println(582344008L * 719476260);
Output: 418982688909250080
JavaScript
document.write(582344008 * 719476260)
Output: 418982688909250050
为什么两个值都不同?
答案 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 point的rounding error错误。
请参见javascript types:
JavaScript中有7种基本类型。
number
表示任意数字:整数或浮点数。整数/十进制值,精度最高为16位。 JavaScript数字都是浮点数,根据IEEE 754标准存储。该标准有几种格式。 JavaScript使用binary64或double precision。顾名思义,数字以64位的二进制格式存储。string
用于字符串。字符串可以包含一个或多个字符,没有单独的单字符类型。boolean
代表true
/ false
。null
用于未知值–具有单个值null
的独立类型。undefined
用于未分配的值–具有单个值undefined
的独立类型。object
用于更复杂的数据结构。symbol
获取唯一标识符。通过typeof
运算符,我们可以查看存储在变量中的类型。
typeof x
或typeof(x)
。"string"
。null
返回"object"
–这是语言错误,实际上不是对象。
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-C24.2.0 (SpiderMonkey)
print("Output: "+582344008 * 719476260)
输出:
Output: 418982688909250050