关于float和double后面小数点数的问题
class Text
{
public static void main(String[] args)
{
float f = 0.15f;
double d = f;
System.out.println("d="+d);//输出结果:0.15000000596046448同一个数弄俩不同类型!!类型提升,位数有4个字节变8个字节,有小数点后的7为升到15位
double d1 = 0.15;
float f1 = (float)d1;
System.out.println("f1="+f1);//输出结果:0.15同一个数弄俩不同类型!强制转换,有8个字节强制变4个字节,丢弃后4个字节~所以值是这个~有小数点后的15为变7位,后面都是0就舍弃啦
double d2 = 1.15 + 1.15f;
System.out.println("d2="+d2);//输出结果:2.299999976158142 类型不同,小数点后面的位数相同 小数点后面是两位相同
double d3 = 3.5 + 3.5f;
System.out.println("d3="+d3);//输出结果:7.0 类型不同,小数点后面的位数相同 小数点后面是一位
double d4 = 1.15 + 1.25f;
System.out.println("d4="+d4);//输出结果: 类型不同,小数点的位数是不同 结果:相加2.4
float f2 = 1.25f +1.15f;
System.out.println("f2="+f2);//输出结果:类型相同 小数点后数字不同 结果是2.4
}
}
//有此结果的有一个新问题! 也就是 d2 d3 d4 的值得问题~~没搞清楚 为什么小数点位后面的数相同且小数点后面数超过两位以上,相加就有会出现精度问题呢??刚搞懂一个问题 新问题有出现啦~~大家想想为啥呀???是不是我咱牛角尖啦??问题出在那里呢??~是不是我钻牛角尖啦??问题出在那里呢??如何避免这样的问题发生?主要想知道出现这个结果的原因是什么?我刚接触JAVA 不对的地方大家请多批评指正呀~谢谢大家~
[解决办法]
不能够用二进制精确表示所有的浮点数
[解决办法]
浮点类型不精确,依赖cpu.
建议使用decibel
[解决办法]
类型转换有一个阶梯,学过C的应该知道,Java估计也沿用此思想,精确度低向精确度高转换是建议的,相反的则会损失精度,通常不推荐,像前面说的8位压缩到4位,就会丢弃后面的有效小数位。