黑马程序员技术交流社区

标题: 求解3-2.4等于0.6吗?10以内的加减法啊,搞不定?? [打印本页]

作者: rslheima    时间: 2012-6-17 11:44
标题: 求解3-2.4等于0.6吗?10以内的加减法啊,搞不定??
public class Test {
public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0.6));
        System.out.println("2-1.4等于0.6吗? "+(2-1.4==0.6));
        System.out.println("3-2.4等于0.6吗? "+(3-2.4==0.6));
        System.out.println("3-2.4等于 "+(3-2.6));//谁能帮我讲讲为什么等于0.3999999999999999
        }

}

结果:
--------------------Configuration: <Default>--------------------
1-0.4等于0.6吗? true
2-1.4等于0.6吗? false
3-2.4等于0.6吗? false
3-2.4等于 0.3999999999999999
谁能帮我讲讲为什么等于0.3999999999999999


作者: 车风波    时间: 2012-6-17 11:53
double是32位的,改成float结果就对了,原因不知道,同求高手。
作者: 李海晓    时间: 2012-6-17 11:53
本帖最后由 李海晓 于 2012-6-17 13:12 编辑

精度缺失 高精度计算一般用BigDecimal类中的方法
BigDecimal a1=new BigDecimal("3");
BigDecimal a2=new BigDecimal("2.6");
BigDecimal value=a1.subtract(a2); //subtrace这个方法是做减法的运算()里为被减数,而且返回的还是BigDecimal类型,
double value1=value.DoubleValue(); //转为double
这是value等于0.4
作者: 吴小东    时间: 2012-6-17 12:19
这个涉及到舍入误差,应该是属于底层算法的问题了,百度上有说,可以去看看
http://zh.wikipedia.org/wiki/%E6%8D%A8%E5%85%A5%E8%AA%A4%E5%B7%AE
作者: 晏文根    时间: 2012-6-17 12:24
本帖最后由 晏文根 于 2012-6-17 12:25 编辑

我在《Effective Java 》一书中看到一个原则,float和double只能用作科学计算或者是工程计算。这是因为这两种类型偶尔会出现结果不准确。
主要原型字符型在内存也是以010101这种二进制的形式存储的,它的小数点后面的是乘以2的指数倍然后取整得到的,这样就可能造成不准确行。毕竟有些数总乘以2还是会是小数的。

至于解决方法可以用ArithUtil工具类也就是上面那哥们写的。






















作者: rslheima    时间: 2012-6-17 12:53
车风波 发表于 2012-6-17 11:53
double是32位的,改成float结果就对了,原因不知道,同求高手。

请问怎么改呢?
在3后加了.0f,也不行啊,还是0.3999999999999999
System.out.println("3-2.4等于 "+(3.0f-2.6));
作者: 车风波    时间: 2012-6-17 12:57
rslheima 发表于 2012-6-17 12:53
请问怎么改呢?
在3后加了.0f,也不行啊,还是0.3999999999999999
System.out.println("3-2.4等于 "+(3.0 ...

2.6上加f
作者: rslheima    时间: 2012-6-17 13:05
李海晓 发表于 2012-6-17 11:53
精度缺失 高精度计算一般用BigDecimal类中的方法
BigDecimal a1=new BigDecimal("3");
BigDecimal a2=new  ...

这个方式没用过,不过,有报错呀!

搜狗截图_2012-06-17_13-03-57.png (9.94 KB, 下载次数: 49)

搜狗截图_2012-06-17_13-03-57.png

作者: rslheima    时间: 2012-6-17 13:09
车风波 发表于 2012-6-17 12:57
2.6上加f

我全加f  都不行哎!呵呵!
System.out.println("3-2.4等于0.6吗? "+(3f-2.4f==0.6f));//结果依然是false
作者: rslheima    时间: 2012-6-17 13:10
吴小东 发表于 2012-6-17 12:19
这个涉及到舍入误差,应该是属于底层算法的问题了,百度上有说,可以去看看
http://zh.wikipedia.org/wiki/ ...

:dizzy:,呵呵!
作者: 李海晓    时间: 2012-6-17 13:13
rslheima 发表于 2012-6-17 13:05
这个方式没用过,不过,有报错呀!

抱歉加一,double value1=value.DoubleValue();,同一个变量不能有2个类型
作者: rslheima    时间: 2012-6-17 13:17
李海晓 发表于 2012-6-17 13:13
抱歉加一,double value1=value.DoubleValue();,同一个变量不能有2个类型

double value1=value.doubleValue();
果然对啦!呵呵,谢谢交流
作者: 车风波    时间: 2012-6-17 13:23
rslheima 发表于 2012-6-17 13:09
我全加f  都不行哎!呵呵!
System.out.println("3-2.4等于0.6吗? "+(3f-2.4f==0.6f));//结果依然是fals ...

减数>2就不行了 不知道为什么
作者: rslheima    时间: 2012-6-17 14:27
车风波 发表于 2012-6-17 13:23
减数>2就不行了 不知道为什么

呵呵,捏你也发现了!
作者: 张頔    时间: 2012-6-17 14:54
rslheima 发表于 2012-6-17 14:27
呵呵,捏你也发现了!

public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0.6));
        System.out.println("2-1.4等于0.6吗? "+((float)(2-1.4)==0.6f));
        System.out.println("3-2.4等于0.6吗? "+((float)(3-2.4)==0.6f));
        System.out.println("3-2.4等于 "+(float)(3-2.6));//谁能帮我讲讲为什么等于0.3999999999999999
        }

注意 在也把0.6写成0.6f
作者: 张頔    时间: 2012-6-17 14:54
public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0.6));
        System.out.println("2-1.4等于0.6吗? "+((float)(2-1.4)==0.6f));
        System.out.println("3-2.4等于0.6吗? "+((float)(3-2.4)==0.6f));
        System.out.println("3-2.4等于 "+(float)(3-2.6));//谁能帮我讲讲为什么等于0.3999999999999999
        }


结果

1-0.4等于0.6吗? true
2-1.4等于0.6吗? true
3-2.4等于0.6吗? true
3-2.4等于 0.4


这样就正确了
作者: rslheima    时间: 2012-6-17 15:11
张頔 发表于 2012-6-17 14:54
public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0 ...

哈哈!果然!!谢谢讨论。
作者: 钟成军    时间: 2012-6-17 15:12
这好像是一个Bug吧,比如下面的例子:
public class Test{
public static void main(String [] args){
int x = 10 ;
float y = 300.3f;

System.out.println(y/x);//输出结果为:30.029999
}
}


作者: rslheima    时间: 2012-6-17 15:26
钟成军 发表于 2012-6-17 15:12
这好像是一个Bug吧,比如下面的例子:
public class Test{
public static void main(String [] args){

对呀,我用jcreator调试时, y赋值时就出现了问题

搜狗截图_2012-06-17_15-18-21.gif (40.35 KB, 下载次数: 51)

搜狗截图_2012-06-17_15-18-21.gif

作者: 钟成军    时间: 2012-6-17 15:31
rslheima 发表于 2012-6-17 15:26
对呀,我用jcreator调试时, y赋值时就出现了问题

我这里没有报错啊

360截图20120617153036099.jpg (25.52 KB, 下载次数: 55)

360截图20120617153036099.jpg

作者: 杨朔    时间: 2012-6-17 15:45
在这道题里面,0.4是一个double类型的应该,在double类型里面的值都是近似值,也就是前面的2和3都被看作是近似值,才导致打印的值不准确,所以出现false。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2