4

如果我表演

  97346822*3f, result is 2.9204048E8,

然而

 97346822*3.0 gives me 2.92040466E8.

请解释。

4

4 回答 4

6

数字3.0是一个值的文字表示double(它相当于3.0d),而3.0f是一个float值。不同的精度解释了为什么你得到不同的结果 - adouble使用 64 位存储,afloat使用 32 位。

于 2013-07-25T18:24:45.710 回答
3
97346822*3.0

将被视为double

基于oracle教程

双精度数据类型是双精度 64 位 IEEE 754 浮点数。它的值范围超出了本次讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。

97346822*3f

将被视为float

于 2013-07-25T18:24:41.160 回答
0

这些是与这个问题相关的发现和我的回答。

虽然 3.0 和 3f 在放入浮点值时具有相同的值,但实际值用作浮点运算的工作内存。作为乘法一部分的内部值本身不适合浮点值并被修改,导致获得的结果之间存在 14.0 的差异。

于 2013-07-26T14:28:19.787 回答
0

Java中有一个叫做数值提升的概念

数字提升用于将数字运算符的操作数(乘法等操作)转换为通用类型(操作数的 2 种数据类型中较小的数字类型转换为较大的数字类型)以执行特定操作

所以在你给出的例子中,97346822*3f因为 3f 是一个浮点值,所以浮点运算完成并且结果是浮点类型。

但是 3.0 是 double 类型,具有更高的范围和精度,导致结果有所不同

所以 3.0 和 3f 的值是相同的,但是当这些值用于数值运算时,结果将根据另一个操作数的数据类型而有所不同

于 2018-06-08T20:50:48.053 回答