俺新手,这个问题也比较纠结,于是在网上找了一份资料,看看能不能帮到你
解决方案1:
因为计算机本身是二进制的,你使用float和double这些节约了内存,对精度就没那么多要求了,要是你对精度有要求,java有java.math.BigDecimal浮点和java.math.BigInteger 整型两个类给你使用
解决方案2:
这是典型的精度丢失,当低级类型对高级类型运算的时候回产生精度丢失。
基本类型加宽转换的19种情况
byte → short, int, long, float, or double
short → int, long, float, or double
char → int, long, float, or double
int → long, float, or double
long → float or double
float → double
double X
这里,从byte、short/char、int、long、float、double排列,向后基本上就是加宽转换。排除:byte→char 、short→char、char→short。加宽转换不会损失原数据的总体信息[有时精度会损失,
如int/long→float、long→double时],不产生任何run-time异常。
解决方案3:
应为计算机存储小数以x/y的分数形式记录的,比如说5/6.你想想10进制的时候1/3是不是一个无线循环小数呢?同理,在二进制环境下,也会出现无限循环。所以说,这个数值是不精确的