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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public class Test {
public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0.6));
        System.out.println("2-1.4等于0.6吗? "+(2-1.4==0.6));
        System.out.println("3-2.4等于0.6吗? "+(3-2.4==0.6));
        System.out.println("3-2.4等于 "+(3-2.6));//谁能帮我讲讲为什么等于0.3999999999999999
        }

}

结果:
--------------------Configuration: <Default>--------------------
1-0.4等于0.6吗? true
2-1.4等于0.6吗? false
3-2.4等于0.6吗? false
3-2.4等于 0.3999999999999999
谁能帮我讲讲为什么等于0.3999999999999999

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

20 个回复

倒序浏览
double是32位的,改成float结果就对了,原因不知道,同求高手。
回复 使用道具 举报
本帖最后由 李海晓 于 2012-6-17 13:12 编辑

精度缺失 高精度计算一般用BigDecimal类中的方法
BigDecimal a1=new BigDecimal("3");
BigDecimal a2=new BigDecimal("2.6");
BigDecimal value=a1.subtract(a2); //subtrace这个方法是做减法的运算()里为被减数,而且返回的还是BigDecimal类型,
double value1=value.DoubleValue(); //转为double
这是value等于0.4

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个涉及到舍入误差,应该是属于底层算法的问题了,百度上有说,可以去看看
http://zh.wikipedia.org/wiki/%E6%8D%A8%E5%85%A5%E8%AA%A4%E5%B7%AE
回复 使用道具 举报
本帖最后由 晏文根 于 2012-6-17 12:25 编辑

我在《Effective Java 》一书中看到一个原则,float和double只能用作科学计算或者是工程计算。这是因为这两种类型偶尔会出现结果不准确。
主要原型字符型在内存也是以010101这种二进制的形式存储的,它的小数点后面的是乘以2的指数倍然后取整得到的,这样就可能造成不准确行。毕竟有些数总乘以2还是会是小数的。

至于解决方法可以用ArithUtil工具类也就是上面那哥们写的。





















回复 使用道具 举报
车风波 发表于 2012-6-17 11:53
double是32位的,改成float结果就对了,原因不知道,同求高手。

请问怎么改呢?
在3后加了.0f,也不行啊,还是0.3999999999999999
System.out.println("3-2.4等于 "+(3.0f-2.6));
回复 使用道具 举报
rslheima 发表于 2012-6-17 12:53
请问怎么改呢?
在3后加了.0f,也不行啊,还是0.3999999999999999
System.out.println("3-2.4等于 "+(3.0 ...

2.6上加f
回复 使用道具 举报
李海晓 发表于 2012-6-17 11:53
精度缺失 高精度计算一般用BigDecimal类中的方法
BigDecimal a1=new BigDecimal("3");
BigDecimal a2=new  ...

这个方式没用过,不过,有报错呀!

搜狗截图_2012-06-17_13-03-57.png (9.94 KB, 下载次数: 50)

搜狗截图_2012-06-17_13-03-57.png
回复 使用道具 举报
车风波 发表于 2012-6-17 12:57
2.6上加f

我全加f  都不行哎!呵呵!
System.out.println("3-2.4等于0.6吗? "+(3f-2.4f==0.6f));//结果依然是false
回复 使用道具 举报
吴小东 发表于 2012-6-17 12:19
这个涉及到舍入误差,应该是属于底层算法的问题了,百度上有说,可以去看看
http://zh.wikipedia.org/wiki/ ...

:dizzy:,呵呵!
回复 使用道具 举报
rslheima 发表于 2012-6-17 13:05
这个方式没用过,不过,有报错呀!

抱歉加一,double value1=value.DoubleValue();,同一个变量不能有2个类型
回复 使用道具 举报
李海晓 发表于 2012-6-17 13:13
抱歉加一,double value1=value.DoubleValue();,同一个变量不能有2个类型

double value1=value.doubleValue();
果然对啦!呵呵,谢谢交流
回复 使用道具 举报
rslheima 发表于 2012-6-17 13:09
我全加f  都不行哎!呵呵!
System.out.println("3-2.4等于0.6吗? "+(3f-2.4f==0.6f));//结果依然是fals ...

减数>2就不行了 不知道为什么
回复 使用道具 举报
车风波 发表于 2012-6-17 13:23
减数>2就不行了 不知道为什么

呵呵,捏你也发现了!
回复 使用道具 举报
rslheima 发表于 2012-6-17 14:27
呵呵,捏你也发现了!

public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0.6));
        System.out.println("2-1.4等于0.6吗? "+((float)(2-1.4)==0.6f));
        System.out.println("3-2.4等于0.6吗? "+((float)(3-2.4)==0.6f));
        System.out.println("3-2.4等于 "+(float)(3-2.6));//谁能帮我讲讲为什么等于0.3999999999999999
        }

注意 在也把0.6写成0.6f
回复 使用道具 举报
public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0.6));
        System.out.println("2-1.4等于0.6吗? "+((float)(2-1.4)==0.6f));
        System.out.println("3-2.4等于0.6吗? "+((float)(3-2.4)==0.6f));
        System.out.println("3-2.4等于 "+(float)(3-2.6));//谁能帮我讲讲为什么等于0.3999999999999999
        }


结果

1-0.4等于0.6吗? true
2-1.4等于0.6吗? true
3-2.4等于0.6吗? true
3-2.4等于 0.4


这样就正确了
回复 使用道具 举报
张頔 发表于 2012-6-17 14:54
public static  void main (String[] args){
        System.out.println("1-0.4等于0.6吗? "+(1-0.4==0 ...

哈哈!果然!!谢谢讨论。
回复 使用道具 举报
这好像是一个Bug吧,比如下面的例子:
public class Test{
public static void main(String [] args){
int x = 10 ;
float y = 300.3f;

System.out.println(y/x);//输出结果为:30.029999
}
}

回复 使用道具 举报
钟成军 发表于 2012-6-17 15:12
这好像是一个Bug吧,比如下面的例子:
public class Test{
public static void main(String [] args){

对呀,我用jcreator调试时, y赋值时就出现了问题

搜狗截图_2012-06-17_15-18-21.gif (40.35 KB, 下载次数: 52)

搜狗截图_2012-06-17_15-18-21.gif
回复 使用道具 举报
rslheima 发表于 2012-6-17 15:26
对呀,我用jcreator调试时, y赋值时就出现了问题

我这里没有报错啊

360截图20120617153036099.jpg (25.52 KB, 下载次数: 56)

360截图20120617153036099.jpg
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马