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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SenGoo 中级黑马   /  2014-10-22 16:11  /  2080 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Test
  2. {
  3.   public static void main(String[] args)
  4.   {
  5.   double x = 0.01;
  6.   double y = 0.09;
  7.   System.out.println(x + y);
  8.   }
  9. }
复制代码
输出结果是0.09999999999999999而不是0.1解决方法一:将x,y改为float
  1. public class Test
  2. {
  3.   public static void main(String[] args)
  4.   {
  5.           /*double x = 0.01;
  6.           double y = 0.09;*/
  7.           float  x = (float) 0.01;
  8.           float y = (float) 0.09;
  9.   System.out.println(x + y);
  10.   }
  11. }
复制代码
输出结果为:0.1

如果把x,y分别改为float的0.01和0.04,在相加,
  1. public class Test
  2. {
  3.   public static void main(String[] args)
  4.   {
  5.           /*double x = 0.01;
  6.           double y = 0.09;*/
  7.           float  x = (float) 0.01;
  8.           float y = (float) 0.04;
  9.   System.out.println(x + y);
  10.   }
  11. }
复制代码
结果居然是0.049999997

是否有第二种方法彻底解决这种精度丢失问题!


5 个回复

倒序浏览
double a = 0.01;
                double b = 0.09;
                DecimalFormat df = new DecimalFormat("#0.00");
                System.out.println(df.format(a+b));

点评

正解!  发表于 2014-10-22 21:49
回复 使用道具 举报
浮点十进制值通常没有完全相同的二进制表示形式。   这是 CPU 所采用的浮点数据表示形式的副作用。 为此,可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果。  
导致此行为的原因是下面之一:
十进制数的二进制表示形式可能不精确。
使用的数字之间类型不匹配(例如,混合使用浮点型和双精度型)。
回复 使用道具 举报
楼主可以了解一下 BigDecimal 这个类,用这个的话可以彻底解决问题的
回复 使用道具 举报
xiaochongbojue 发表于 2014-10-22 21:41
楼主可以了解一下 BigDecimal 这个类,用这个的话可以彻底解决问题的

我知道这个类!具体的代码你嫩不能给我啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马