2 lrj1596 lrj1596 于 2016.03.19 16:38 提问

Java的double类型在运算时,结果有的时候不能精确显示。我知道是进制导致的。 10C

下图讲解,我懂。
图片说明
但是,在做题的时候.............
图片说明
才发现,我也只能确定0.1不能被精确显示,具体该如何解这样的题呢?
其实我进一步思考了。我以为就看尾数是不是5。比如0.5、0.05。因为2的-x次方的尾数都是5。是5就能精确显示,不是就不能。但是后来发现.................
图片说明
说明不能只靠最终结果来判断...............那该怎么判断啊?

问题补充:我知道有BigDecimal这个类,我只可以用这个类避免精度问题。
但是我的问题就是如果做笔试题的时候,遇到这种挫科的问题(如第二幅图所示,刚刚图错了,不好意思哈~~呵呵),该如何找到正确的选项?

3个回答

zqftisson
zqftisson   2016.03.19 19:08

对于float 和 double, 建议用BigDecimal进行运算。


import java.math.BigDecimal;

public class DoubleTest {
    public static void main(String[] args) {
        double d = 3.0d;
        double f = 2.1d;
        BigDecimal bd1 = new BigDecimal(Double.toString(d));
        BigDecimal bd2 = new BigDecimal(Double.toString(f));
        System.out.println("result=" + bd1.subtract(bd2));
    }
}

xionglangs
xionglangs   Rxr 2016.03.19 19:37

看看这篇文章就可以了。还是用BigDecimal类吧,我项目里面用的就是这个类,http://blog.csdn.net/xionglangs/article/details/50932565。

caozhy
caozhy   Ds   Rxr 2016.03.19 23:44

有两个误差,一个是浮点本身的误差,一个是进制转换误差,能精确表示的小数必须可以分解为1/2^n的和,比如0.5 0.25 0.125 0.0625...,不是带5结尾。
另外还有浮点本身的误差,比如说10^10000+10^-10000相加,因为两者的数量级差异太大,所以第二个数会被舍去,如果计算10^10000+10^-10000-10^10000,那么结果可能是0,而不是10^-10000

caozhy
caozhy 回复lrj1596: 如果误差是正数,那么在进制转换后就不会体现出来
一年多之前 回复
lrj1596
lrj1596 回复caozhy: 3.0-2.1会由于制转换会导致最后舍入的缺失;1.0-0.1为什么就不会?
一年多之前 回复
caozhy
caozhy 回复lrj1596: 这个是进制转换,当本身浮点误差存在的时候,进制转换会导致最后舍入的缺失
一年多之前 回复
lrj1596
lrj1596 可是第三幅图中的最后两行输出结果其实都是0.9(0.899999999999本来也是0.9),假设0.9可以分解为1/2^n的和,那为什么一个显示成0.9;另一个却显示成0.89999999999(即,出现无法精确显示的现象)
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!