大小事项
32 位浮点数 →float x = 3.14 ;
← 64 位双精度
Java 中小数数字文字的默认值是 64 位原语double
类型,如图所示马克·罗特维尔的回答 https://stackoverflow.com/a/66158887/642706. 3.14
is a double
, as is 3.14d
and 3.14D
.
原始的float
类型更小,32位。
如果 Java 能够推断出你的意思said is a double
但你什么meant is a float
,Java 必须将 64 位值减少为 32 位值,丢弃一半数据,即 32 位。这可能涉及数据丢失对于更大的数字。这肯定意味着容量损失.
所以Java的设计者决定在这件事上保守一点。他们决定不随意丢弃一半的数据,也不将指定的容量减少一半。他们决定相信你的话——如果你说 64 位double
,他们给你一个double
.
如果您接着说要将 64 位数字塞入 32 位容器中,它们会标记错误,因为 64 位不适合 32 位。方钉,圆孔。
圆孔,32位浮点数 →float x = 3.14 ;
← 64 位双、方钉
Java 确实支持相反的情况,即扩大转换。你可以放一个32位的float
转换为 64 位double
。你可以放一个32位的int
转换为 64 位long
。这些操作是安全的,因为额外的 32 位可以安全地用零填充。所以Java愿意并且能够支持这些操作。
明确
我建议你养成明确的习惯。不要依赖默认值。如果你指的是 32 位float
,附加f
or F
按照你的字面意思。如果你指的是 64 位double
,附加d
or D
按照你的字面意思。
这样做不仅可以让编译器安静下来,还可以让阅读代码的人清楚你的意图。
float pi = 3.14F ;
double pi = 3.14d ;
BigDecimal
顺便说一句,如果你关心准确性而非性能 https://en.m.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems,你将使用BigDecimal https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html而不是float
/double
。在这种情况下,这个问题就没有意义了。
BigDecimal pi = new BigDecimal( "3.14" ) ;