A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 136616244 中级黑马   /  2014-5-2 10:08  /  1357 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

double d=3-2.6;
  System.out.println(d==0.4);的值为什么为false?


Double d=3-0.5;
  System.out.println(d==2.5);的值为什么为True?




还有一个就是浮点数的存储,float  类型值为8.1f的符号位,指数域,有效位数分别是多少?怎么算来的?详细点,先谢谢了:lol




8 个回复

倒序浏览
本帖最后由 136616244 于 2014-5-2 10:37 编辑

都说浮点数是近似存储但是我不是太懂,于是就在百度了一下,还是不懂,于是乎今天在图书馆找到一本书介绍浮点数,从22页介绍到44页,还是一头雾水,坐等大神来
回复 使用道具 举报
因为==是比较运算符,它的最后结果只能是true or false,上面代码中d不等于0.4所以输出false,下面两行代码同理,另外我不明白的是为什么定义double d=3-2.6;编译运行通过了,3-2.6是什么数?
回复 使用道具 举报
是由于小数的小数部分的二进制计算不精确。
回复 使用道具 举报
在java中具体类型的浮点数运算是不精确的,如果在java程序中输
出3-2.6的值,可以看到输出的结果为0.3999999999999999,这个值
是不精确的,所以表达式3-2.6==0.4的值是假,即:false;
1、使用基本数据类型进行浮点数计算,并输出差值和比较结果
  1. public class Compare{
  2.          public static void main(String[] args){
  3.               System.out.println(3-2.6);
  4.               System.out.println(3-2.26==0.4);
  5. }
  6. }
复制代码
           
2、使用BigDecimal进行浮点数计算,并输出差值和比较结果
  1. import java.math.BigDecimal;
  2. public class Compare {
  3.        public static void main(String[] args){
  4.           BigDecimal x=new BigDecimal("3");        
  5.           BigDecimal y=new BigDecimal("2.6");      
  6.           BigDecimal z=x.subtract(y);              
  7.           double value=z.doubleValue();            //将计算结果转换为基本数据类型double型
  8.           System.out.println(value);               //输出计算结果
  9.           System.out.println(value==0.4);
  10. }
  11. }
复制代码
回复 使用道具 举报
想飞的鱼 发表于 2014-5-2 10:46
因为==是比较运算符,它的最后结果只能是true or false,上面代码中d不等于0.4所以输出false,下面两行代码 ...

哦 ,原来是减号,恍然大悟~:L这两天学白痴了.......我会错了意,我的回答你可以直接忽略了!汗、、、
回复 使用道具 举报
skill20 发表于 2014-5-2 11:13
在java中具体类型的浮点数运算是不精确的,如果在java程序中输
出3-2.6的值,可以看到输出的结果为0.399999 ...

你在哪copy的吧
回复 使用道具 举报
好像是由于双精度储存的问题,它保留15个有效小数位
回复 使用道具 举报
郭帅帅 发表于 2014-5-2 13:14
好像是由于双精度储存的问题,它保留15个有效小数位

float 有8个有效位,称为单精度,Double有16个有效位,称为双精度
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马