黑马程序员技术交流社区

标题: 基本数据类型的问题 [打印本页]

作者: 136616244    时间: 2014-4-26 21:48
标题: 基本数据类型的问题
3-2.6==0.4的值是什么?
作者: @文瑞    时间: 2014-4-26 22:17
这个是 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:21
本帖最后由 曲佳奇 于 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. }
复制代码



作者: @文瑞    时间: 2014-4-26 22:21
刚试了一下,结果是FALSE,我也迷茫了,和楼主一起等待答案
作者: fendoubuxi    时间: 2014-4-26 23:17
二进制表示的小数的时候是不精确的,而小数的默认精度是double,精度太高。实际上3-2.6的值是0.3999999999999999
作者: 小马初长成    时间: 2014-4-26 23:42
首先对表达式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对象
作者: 四川男人    时间: 2014-4-26 23:45
false
3-2.6  3是int型,2.6是double型,
二进制在转换小数的时候有取舍,结果应该是0.399999,所以结果是false
作者: eternallove    时间: 2014-4-27 00:48
结果为FALSE,在计算机上小数都是有精确位的,比如:0.4,实际上就是3.99999...
作者: ς高眼光の目标    时间: 2014-4-27 02:51
false     
作者: 136616244    时间: 2014-4-27 18:04
曲佳奇 发表于 2014-4-26 22:21
false
由于java的简单类型不能够精确的对浮点数进行运算
不光是java ,其它语言也存在同样的问题。

QQ多少?不懂




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