当前位置: 代码迷 >> J2SE >> double + double 有关问题
  详细解决方案

double + double 有关问题

热度:146   发布时间:2016-04-23 20:15:58.0
double + double 问题
public static void main(String[] args) {
double d1 = 0.8;
double d2 = 47.9;
System.out.println((d1+d2));

}


相加以后为什么是48.699999999999996?????
请大神解决
------解决思路----------------------
小数在计算机中都是近似存储的,两个近似存储的数据一起计算,得到的就更近似了
楼主可以给结果取近似值
或 使用 

BigDecimal bd1 = new BigDecimal(0.8);
BigDecimal bd2 = new BigDecimal(47.9);
System.out.println(bd1.add(bd2));

得到的更近似的值 
或使用

BigDecimal bd3 = new BigDecimal(new Double(0.8).toString());
BigDecimal bd4 = new BigDecimal(new Double(47.9).toString());
System.out.println(bd3.add(bd4));

得到精确值
------解决思路----------------------
原因在于浮点数使用二进制表示的,小数部分用2^-1+2^-2……表示.类似的式子2.0-1.1 = 0.899999。必要时要用bigdecimal
------解决思路----------------------
double 确实不可以,double取得只能是近似值
浮点数存储时就已经近似存储了,再计算,就更近似了
------解决思路----------------------
引用:
Quote: 引用:

原因在于浮点数使用二进制表示的,小数部分用2^-1+2^-2……表示.类似的式子2.0-1.1 = 0.899999。必要时要用bigdecimal

如果数据比较多的情况下,这种方法会影响处理速度吗?
这对CPU来说都是小case,现在主要的瓶颈是传输速度更不是CPU的处理速度,所以缓存技术无处不在
------解决思路----------------------
原来的问题在于:
计算机内部用2进制保存数字,正好遇到不能用2进制严格表达的double了(比较像十进制数无法精确表达1/3一样)
比如(0.8 + 0.8就能精确地计算出来1.6)

非要用double的一种解决办法【应该是一种数值计算方法】:
package topics_390901294;

public class DoubleTest {
    public static void main(String[] args) {
        double d1 = 0.8;
        double d2 = 47.9;
        System.out.println(d1 + d2);
        System.out.println((d1 * 10.0 + d2 * 10.0) / 10.0);
    }
}


输出:
48.699999999999996
48.7

------解决思路----------------------
引用:
怎样才能简单的使得0.8 + 47.9 = 48.7 呢?


所有数字先放大100倍计算完了再缩小100倍,都是整数就无差错了吧。
------解决思路----------------------
double虽然是双精度,但是计算机语言是01语言二进制,就和十进制的10除以3一样有除不尽的时候,所以会出现那种情况
  相关解决方案