如果我执行
97346822*3f, result is 2.9204048E8,
然而
97346822*3.0 gives me 2.92040466E8.
请解释。
答案 0 :(得分:7)
数字3.0
是double
值的literal representation(相当于3.0d
),而3.0f
是float
值。不同的精度解释了为什么你得到不同的结果 - double
使用64位存储,float
使用32位。
答案 1 :(得分:3)
97346822*3.0
将被视为double
。
双数据类型是双精度64位IEEE 754浮点。其值范围超出了本讨论的范围,但在Java语言规范的浮点类型,格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。
97346822*3f
将被视为float
。
答案 2 :(得分:0)
这些是与this question相关的调查结果以及我对此的回答。
虽然3.0和3f在放入浮点值时都具有相同的值,但实际值用作浮点运算的工作存储器。作为乘法一部分的内部值不适合浮点值本身并被修改,导致获得的结果之间的差值为14.0。
答案 3 :(得分:0)
Java中有一个名为Numeric promotion的概念
数字促销用于将数字运算符的操作数(如乘法等操作)转换为公共类型(较小的数字类型到操作数的2种数据类型中的较大数值类型)以执行特定操作< / p>
所以在你给出的例子中,对于97346822*3f
,因为3f是一个浮点值,所以浮点运算完成,结果是float类型。
但3.0是双重类型,具有更高的范围和精度,导致结果变化
因此3.0和3f的值相同,但是当在数值运算中使用这些值时,结果将根据另一个操作数的数据类型而变化