黑马程序员技术交流社区

标题: 大神求看代码 [打印本页]

作者: 李大大    时间: 2015-3-29 16:16
标题: 大神求看代码
class hehe
{
        public static void main(String[] args)
        {
        System.out.println(2.00-1.10);
        }
}

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

这是java数据底层的设计问题,三楼正解,图中是我在手机APP上看到的,有兴趣就好好理解一下

2015-03-30 204515.png (141.5 KB, 下载次数: 28)

2015-03-30 204515.png

2015-03-30 204524.png (153.66 KB, 下载次数: 25)

2015-03-30 204524.png

2015-03-30 204531.png (132.59 KB, 下载次数: 28)

2015-03-30 204531.png

2015-03-30 204545.png (141.08 KB, 下载次数: 21)

2015-03-30 204545.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2