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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李亚飞 中级黑马   /  2012-12-18 17:46  /  1387 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李亚飞 于 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);
      }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

3 个回复

倒序浏览
本帖最后由 孙辉辉 于 2012-12-18 18:02 编辑

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

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 依然AI 于 2012-12-18 18:16 编辑

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

有种简单的方法  可以先乘  去掉小数点  做运算然后再除 可以避免 浮点运算

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
double二进制转换进度不高,
使用BigDecimal这个精度高
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马