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