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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李大大 中级黑马   /  2015-3-29 16:16  /  1581 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class hehe
{
        public static void main(String[] args)
        {
        System.out.println(2.00-1.10);
        }
}

为什么输出的不是0.9

11 个回复

倒序浏览
我只知道要在强转一下,也就是(float)(2.00-1.10),至于为什么,估计要去看看计算机里小数点后的2进制是怎么算的了,关于这个我看不懂就放弃了,求楼下大神解惑!
回复 使用道具 举报
我也不懂啊
回复 使用道具 举报
这个问题看似简单,其实涉及到原码,补码,反码  太深奥了 搞不懂
回复 使用道具 举报 1 0
小数默认类型是double,所以输出的结果不是0.9
回复 使用道具 举报
同样不懂,等大神出现
回复 使用道具 举报
大概是因为浮点数值是采用二进制系统表示的,而在系统中无法精确的表示分数1/10。
遇到这种情况我们也只能选择避免,强转成float类型就可以了。
有一道经典的数学恒等式:
1=0.9999999999……
如果深究,都说不出个所以然,个人认为只做了解就可以了
回复 使用道具 举报
楼上正解,想要做精确运算的话可以使用BigDecimal这个类
回复 使用道具 举报
double  float类型的转换的时候都会有精度丢失的,直接赋值的时候单独打印看不出来,但是一旦经行运算就会出现精度问题,
回复 使用道具 举报
.....一回车就发送出去了...
针对此问题Java提供了一个类BigDecimal这类就是用来出来浮点数精度丢失问题
但是转化的时候要注意,要把数据从String类型转换成BigDecimal才行,因为double在转换之前就已经是精度有问题的了,直接转换过去的话精度还是有问题的.
回复 使用道具 举报
这也是面试题吗,如果遇到这种面试题就麻烦了~
回复 使用道具 举报
本帖最后由 JarryHorse 于 2015-3-30 21:16 编辑

这是java数据底层的设计问题,三楼正解,图中是我在手机APP上看到的,有兴趣就好好理解一下
更多图片 小图 大图
组图打开中,请稍候......
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马