条件判断时很容易忽略的问题就是数据精度,引起我思考这个问题是由于下面的代码
我的原意是让rockangle在30度角和60度角中来回摆动,但却发现rockangle的值出现了负值! 最终发现是判断时数据的精度引发的问题,解决办法也很简单,用其他数据类型的变量去参与判断就可以了。
继续试验发现只有浮点型数据类型会发生这种情况:
1、double 和 double 类型的比较
double 和 double 类型的比较, 会比较到小数点后16位 也就是说小数点后16位是相同的那么就是相同的,但要是小数点后16位内有一点点不同那么也是不相同的!(就是上面角度判断遇到的问题)
2、 float和float类型的比较:
这和double类型类似 ,只是会比较到小数点后七位。
3、float和double类型比较:
这有点不同,就是只能比较整数部分,小数点后有不为0的数存在,就是不相同的,但要是只有0,那么也是相同的。
从表面上我就发现这么多,具体原因留待以后。
private double pi=Math.PI;
private double rockangle=pi/4;
private double addangle=pi/36;
private int a=1;
for(int i=0;i<500;i++){
if(a==1){
rockangle=rockangle+addangle;
if(rockangle==pi/3){
a=2;
System.out.println("111111111111111111");
}
}
if(a==2){
rockangle=rockangle-addangle; if(rockangle==pi/6){
a=1;
System.out.println("222222222222222222");
}
System.out.println("rockangle="+rockange);
}
}
我的原意是让rockangle在30度角和60度角中来回摆动,但却发现rockangle的值出现了负值! 最终发现是判断时数据的精度引发的问题,解决办法也很简单,用其他数据类型的变量去参与判断就可以了。
继续试验发现只有浮点型数据类型会发生这种情况:
1、double 和 double 类型的比较
public static void main(String[] args) {
//float和float 小数点后七位
//double和double 小数点后16位
//double 和 float比较 小数点后可以有0 但是不能有其他值 否则为不相等
double a=1.340000789;
double b=1.340000345;
if(a==b){
System.out.println("相等");
}else{
System.out.println("不相等");
}
}
double 和 double 类型的比较, 会比较到小数点后16位 也就是说小数点后16位是相同的那么就是相同的,但要是小数点后16位内有一点点不同那么也是不相同的!(就是上面角度判断遇到的问题)
2、 float和float类型的比较:
这和double类型类似 ,只是会比较到小数点后七位。
3、float和double类型比较:
public static void main(String[] args) {
float a=1.00000000f;
double b=1.00000000;
if(a==b){
System.out.println("相等");
}else{
System.out.println("不相等");
}
}
这有点不同,就是只能比较整数部分,小数点后有不为0的数存在,就是不相同的,但要是只有0,那么也是相同的。
从表面上我就发现这么多,具体原因留待以后。
本文通过一个具体的编程案例探讨了浮点数运算和比较时可能遇到的精度问题,并详细分析了不同浮点数类型(如float和double)之间的比较差异。
359

被折叠的 条评论
为什么被折叠?



