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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qiucheng1990 中级黑马   /  2012-11-28 07:59  /  1964 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void main(String[] args) {
  // TODO Auto-generated method stub
  double x=2;
  double y=1.1;
  System.out.println(x-y);
}
为什么这行代码的结果是0.8999999,而不是0.9呢?
我想要的结果是0.9,该怎样解决呢

评分

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

查看全部评分

6 个回复

正序浏览
陈山 中级黑马 2012-11-29 21:12:44
7#
可以对运算的结果进行强制转型成float类型
        public static void main(String [] args){
                 double x=2;
                  double y=1.1;
                  System.out.println((float)(x-y));

        }
回复 使用道具 举报
Java中浮点数(double、float)的计算是非精确计算,请看下面一个例子:

    System.out.println(0.05 + 0.01);

    System.out.println(1.0 - 0.42);

    System.out.println(4.015 * 100);

    System.out.println(123.3 / 100);

你的期望输出是什么?可实际的输出确实这样的:

    0.060000000000000005

0.5800000000000001

401.49999999999994

1.2329999999999999

使用BigDecimal(String)构造器,我们建议,在商业应用开发中,涉及金额等浮点数计算的数据,全部定义为String,数据库中可定义为字符型字段,在需要使用这些数据进行运算的时候,使用BigDecimal(String)构造BigDecimal对象进行运算,保证数据的精确计算。同时避免了科学记数法的出现。如果科学记数表示法在应用中不是一种负担的话,可以考虑定义为浮点类型

这个问题有点难度,我这收集了一个关于精确存储数据的帖子讲的很清楚,有兴趣可以看看
http://blog.csdn.net/tianlincao/article/details/5654880
回复 使用道具 举报
浮点数的精度问题。解决办法如下。(x-y)*10后自动进位,再除10还原数值0.9。
System.out.println((x-y)*10/10);
回复 使用道具 举报
这个java 浮点运算造成的错误,java只能计算整形,浮点计算都是错误的解决办法
在java中提供了专门的API来搞定。。具体怎么搞的我也不知道

用BigDecimal

public class Test {

public static void main(String[] args) {
  System.out.println((new BigDecimal("2.0")).subtract(new BigDecimal("1.9")).doubleValue());
}
}

注意只能传String

b1.add(b2).doubleValue();//----加
b1.subtract(b2).doubleValue();//---减
b1.multiply(b2).doubleValue();//---乘
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();//---除
注意:除要麻烦点。。。scale 表示表示需要精确到小数点以后几位, 定精度,以后的数字四舍五入。

评分

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

查看全部评分

回复 使用道具 举报
这个是java在表示小数中的一个问题,1.1在java中的实际值为1.100000000000000088817841970012523233890533447265625...,并不是咱理想中的1.1,因此在实际应用中计算小数前都要指定精度,并且尽量使用BigDecimal类提供的API方法。
回复 使用道具 举报
可以通过String.format("%.1f",x-y),对x-y进行四舍五入,并且只保留一位小数

public static void main(String[] args) {
  // TODO Auto-generated method stub
  double x=2;
  double y=1.1;
  System.out.println(String.format("%.1f",x-y));
}

打印的结果是0.9

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马