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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 136616244 中级黑马   /  2014-4-26 21:48  /  1277 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3-2.6==0.4的值是什么?

9 个回复

倒序浏览
这个是 TRUE吧  运算时int类型会转换为float
这是Java中的基本数据类型转换规则:
(1)布尔型和其它基本数据类型之间不能相互转换;
(2)byte型可以转换为short、int、、long、float和double;
(3)short可转换为int、long、float和double;
(4)char可转换为int、long、float和double;
(5)int可转换为long、float和double;
(6)long可转换为float和double;
(7)float可转换为double;
回复 使用道具 举报
本帖最后由 曲佳奇 于 2014-4-26 22:26 编辑

false
由于java的简单类型不能够精确的对浮点数进行运算
不光是java ,其它语言也存在同样的问题。
虽然现在CPU都支持浮点的运算了,但是CPU在处理的时候,也是先把浮点数(float , double)转成整数再转成二进制,然后进行操作,如果有取余,会有不同的取余方式。
再加上运算完成后,再多二进制转成上层的浮点,又会有一些取舍。就造成了呈现出来时的简单明显的错误 。
3.0-0.6的结果为0.39999999999 不等于0.4
想要精确运算的话 可以查下BigDecimal
  1. import java.math.BigDecimal;

  2. class Test {
  3.         public static void main(String[] args)
  4.         {
  5.                 double a = 3.0;
  6.                 double b = 2.6;
  7.                 BigDecimal a1 = new BigDecimal(a+"");
  8.                 BigDecimal b1 = new BigDecimal(b+"");
  9.                 System.out.println(a1.subtract(b1).doubleValue());
  10.         }
  11. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
刚试了一下,结果是FALSE,我也迷茫了,和楼主一起等待答案
回复 使用道具 举报
二进制表示的小数的时候是不精确的,而小数的默认精度是double,精度太高。实际上3-2.6的值是0.3999999999999999
回复 使用道具 举报
首先对表达式3-2.6==0.4进行分析,该表达式有两个运算符,分别为
减运算符“-”和关系运算符“==”,由于减运算符“-”的优先级高
于关系运算符“==”,所以该表达式将输出一个布尔值,即输出true
或false,具体输出什么取决于3-2.6的值
在java中具体类型的浮点数运算是否不精确的,如果在java程序中输
出3-2.6的值,可以看到输出的结果为0.3999999999999999,这个值
是不精确的,所以表达式3-2.6==0.4的值是假,即:false;
例如:
自己运行以下下面两个程序看结果
1、使用基本数据类型进行浮点数计算,并输出差值和比较结果
  1. public class ImpreciseResult{
  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 PrecisionResult {
  3.        public static void main(String[] args){
  4.           BigDecimal x=new BigDecimal("3");        //创建3的BigDecimal对象
  5.           BigDecimal y=new BigDecimal("2.6");      //创建2.6的BigDecimal对象
  6.           BigDecimal z=x.subtract(y);              //计算3与2.6的差值
  7.           double value=z.doubleValue();            //将计算结果转换为基本数据类型double型
  8.           System.out.println(value);               //输出计算结果
  9.           System.out.println(value==0.4);
  10. }
  11. }
复制代码

为了得到精确的计算结果,对于浮点数的运算一般不使用基本数据类型来实现,而是使用BigDecimal类来实现,但是在使用BigDecimal创建对象时,构造方法的参数要使用双引号括起来,而不能直接在构造方法中写浮点值创建BigDecimal对象

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
false
3-2.6  3是int型,2.6是double型,
二进制在转换小数的时候有取舍,结果应该是0.399999,所以结果是false
回复 使用道具 举报
结果为FALSE,在计算机上小数都是有精确位的,比如:0.4,实际上就是3.99999...
回复 使用道具 举报
false     
回复 使用道具 举报
曲佳奇 发表于 2014-4-26 22:21
false
由于java的简单类型不能够精确的对浮点数进行运算
不光是java ,其它语言也存在同样的问题。

QQ多少?不懂
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马