代码如下:
System.out.println(10 / 3.0); 
这行代码输出的是3.3333333333333335
我知道有两个知识点:
1.整数和小数进行运算的时候,整数的类型自动提升为double类型,两个double类型进行相除运算,结果得到小数(也就是3.3333333333333335),即10先自动提升为double类型,再和3.0进行除法运算
2./获取的是除法操作的商,%获取的是除法操作的余数
而我的问题是:这行代码怎么算到是3.3333333333333335?
不知道这么想对不对:按照我们平时的计算法则,10除以3的商是3,余数是1,但是10变成double和同样是double类型的3.0进行除法运算就涉及到二进制除法了,先把double这个8字节的数据类型展开成32个二进制位,然后进行二进制的除法计算得到补码,然后补码倒推出源码,把商提取出来
再扯下去我就晕了
我不是计算机相关专业的,有没有大佬能详细的解答下

解决方案 »

  1.   

    这个是浮点数精度的问题,不只是java语言的问题,详见:https://zh.wikipedia.org/wiki/%E6%B5%AE%E7%82%B9%E6%95%B0
      

  2.   

    那个网站打不开
    因为刚跟着视频学,现在是javase部分,所以可能对java语言认知还不太全面
      

  3.   

    你上了Google?这样,你在百度搜一下java 浮点数精度的问题,也可以参考这个网址:https://www.jianshu.com/p/1d6ba0047a5b。其实这个细节你不需要太关心,你只需要在程序中,如果判断两个浮点数是否相等,可以这样写 if (f1 - f2 < precision) { }
      

  4.   

    那个precision就是自定义的精度
      

  5.   

    在计算机中浮点数存在不精准的问题,但在java里面有一个类专门来解决数据精度问题,如果对数据精度要求很高的话,可以使用BigDecimal上面的例子可以用如下代码实现精准计算:
    public class TestA { public static void main(String[] args) {
    // TODO Auto-generated method stub
    BigDecimal a1 = new BigDecimal(Double.toString(10));
    BigDecimal a2 = new BigDecimal(Double.toString(3));
    System.out.println(a1.divide(a2, 20, BigDecimal.ROUND_HALF_UP));
    }}
    输出结果:3.33333333333333333333
    目前设置的精度是小数点后20位,采用的是四舍五入
      

  6.   


    诸位大佬你们讲得太深了,我昨天才刚刚学到if语句和swich语句,第一个大佬提到的那个IEEE754我是在学 long和float的时候视频里的老师才有提到的,但是也是很简简单单的讲了下,并没有深入的讲解IEEE754
    不知道是不是我看的是培训机构的视频的原因,我觉得有几个知识点可以深挖的,但视频里的老师都没讲的太细,我也不知道这么深挖有没有必要。我先放一放,学完javase再回来看看
    顺便问下,由于我是第一次来csdn,貌似这里和其他论坛不太一样,我引用你的回复,你看得到吗,我都不知道我回复的你们有没有看的到,貌似这样不利于交流
    还有,好像我是要点   结贴  那个按键的吧,不知道怎么给分你们csdn这种发帖搞得我晕乎乎的
      

  7.   

    计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降
    参考https://www.cnblogs.com/pcheng/p/5588652.htm
      

  8.   


    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数
      

  9.   

    其实你不用深究这个问题,这个问题里 在java里叫舍入误差,比如5-4.9的时候 也会出现0.09999999999999964,你只要记得有这个问题,以后做关于精确数字的开发业务时,避免出现这种问题就行了,也有对应解决的办法,就比如楼上说的BigDecimal,专门用于解决精度的问题
      

  10.   

    就像10进制的小数不能精准的表示0.333……一样。二进制的计算机也无法精准的表示一个小数。所有的小数都是以近似值的形式存储在计算机中,如果对精度要求非常高的话,可以使用BigDcimal
      

  11.   

    double为浮点型 ,你用double进行计算涉及到小数是部队的,在给转换为double的时候,比如整型int 1 转换为double时,会被转换成0.99999....9999
    或者1.0000....001 这种,所以除出来的数据精度存在偏差,对double类型的进行运算需要先转换称bigdecimal型的
      

  12.   

    计算机语言是采用二进制的,而二进制无法表示1/10,就像十进制无法精确表示1/3一样。例如1-0.9得到的是0.09999999999999998,而不是0.1一样。在金融等不允许有误差的时候可以采用BigDecimal类。