黑马程序员技术交流社区

标题: 发现一个有意思的问题:double 计算 [打印本页]

作者: 李亚飞    时间: 2012-12-18 17:46
标题: 发现一个有意思的问题:double 计算
本帖最后由 李亚飞 于 2012-12-19 10:21 编辑

package com.String;
public class StringText {
    /**
     * 发现一个有意思的问题:double 计算: 2.00 - 1.10
    * 结果是:0.8999999999999999
    * 谁知道为什么?
    */
      public static void main(String[] args) {
                    System.out.println(2.00 - 1.10);
      }
}


作者: 孙辉辉    时间: 2012-12-18 18:01
本帖最后由 孙辉辉 于 2012-12-18 18:02 编辑

其实这个和1=0.9999999999一个意思,自己换算下就知道,0.9换算成二进制是个无限循环小数。要用有限的位数表示它是不可能的,只能取近似值。由于计算机硬件取近似值时用的是去尾法,取得的近似值会略小于真值。因此得到的结果就是0.89999999999。
结论是:在需要精确答案的地方,要避免使用float和double;对于货币计算,要使用int、long或BigDecimal。
作者: 依然AI    时间: 2012-12-18 18:12
本帖最后由 依然AI 于 2012-12-18 18:16 编辑

出现这种问题的原因是浮点数值是采用二进制系统表示的,而在系统中无法精确的表示分数1/10。
需要在计算中不含有任何舍入误差,就应该使用BigDecimal类。
将一个类标记为strictfp  ,那么这个类中的所有方法都要使用严格的浮点数计算,
将一个方法标记为strictfp,那么这个方法就会使用严格的浮点数计算,
public static strictfp void main(String [] args)

有种简单的方法  可以先乘  去掉小数点  做运算然后再除 可以避免 浮点运算
作者: yuchen208    时间: 2012-12-18 18:48
double二进制转换进度不高,
使用BigDecimal这个精度高




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