DC娱乐网

学Java三年才发现:0.1+0.2居然不等于0.3!8种数据类型的隐藏陷阱

很多Java初学者都被一个问题困扰过:为什么在代码里写 0.1 + 0.2,得到的不是 0.3,而是一个奇怪的数字 0.

很多Java初学者都被一个问题困扰过:为什么在代码里写 0.1 + 0.2,得到的不是 0.3,而是一个奇怪的数字 0.30000000000000004?

这不是Java的Bug,而是计算机处理小数的"先天缺陷"。0.1在二进制中是无限循环小数,就像十进制里1÷3永远除不完,计算机截断后就有了误差。

今天就来聊聊Java基本数据类型里最让人头疼的3个问题。

问题1:浮点数不能算钱

0.1+0.2在Java中等于0.30000000000000004,不是0.3。如果用double来计算商品价格,累计误差可能导致账目不平。

解决办法:金额计算用BigDecimal,并且用字符串来创建——new BigDecimal("19.99"),不要用new BigDecimal(19.99)。

问题2:整数溢出是哑巴

int类型最大存21.5亿。超了之后不报错,直接变成负数。2147483647+1=-2147483648,代码正常运行但结果完全错误。

解决办法:大数用long,关键运算用Math.addExact()检测溢出。

问题3:后缀不能忘

float变量赋值必须加f(如3.14f),long变量超int范围必须加L(如10000000000L)。忘了就编译报错。

8种基本类型速记

整数4种:byte→short→int→long,日常用int就够,大了用long。

小数2种:float和double,日常用double。

其他2种:boolean(true/false)和char(单个字符)。

String不是基本类型,是java.lang.String类。

日常选型一句话

整数int,大数long,小数double,算钱BigDecimal。数组长度固定,想伸缩用ArrayList。

作者:

| 公众号同名,专注Java技术分享