double + double 问题

yueyuexiong 2014-10-08 05:49:54
public static void main(String[] args) {
double d1 = 0.8;
double d2 = 47.9;
System.out.println((d1+d2));

}


相加以后为什么是48.699999999999996?????
请大神解决
...全文
418 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jx_mascot 2014-10-09
  • 打赏
  • 举报
回复
double虽然是双精度,但是计算机语言是01语言二进制,就和十进制的10除以3一样有除不尽的时候,所以会出现那种情况
humanity 2014-10-09
  • 打赏
  • 举报
回复
引用 12 楼 Mr_WangB 的回复:
怎样才能简单的使得0.8 + 47.9 = 48.7 呢?
所有数字先放大100倍计算完了再缩小100倍,都是整数就无差错了吧。
mr_wangb 2014-10-08
  • 打赏
  • 举报
回复
怎样才能简单的使得0.8 + 47.9 = 48.7 呢?
日知己所无 2014-10-08
  • 打赏
  • 举报
回复
原来的问题在于: 计算机内部用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
  • 打赏
  • 举报
回复
XXX到此一游
yueyuexiong 2014-10-08
  • 打赏
  • 举报
回复
引用 8 楼 sum_rain 的回复:
[quote=引用 6 楼 u011201384 的回复:] [quote=引用 5 楼 sum_rain 的回复:] 原因在于浮点数使用二进制表示的,小数部分用2^-1+2^-2……表示.类似的式子2.0-1.1 = 0.899999。必要时要用bigdecimal
如果数据比较多的情况下,这种方法会影响处理速度吗?[/quote]这对CPU来说都是小case,现在主要的瓶颈是传输速度更不是CPU的处理速度,所以缓存技术无处不在[/quote] 受教了
AceShot 2014-10-08
  • 打赏
  • 举报
回复
引用 6 楼 u011201384 的回复:
[quote=引用 5 楼 sum_rain 的回复:] 原因在于浮点数使用二进制表示的,小数部分用2^-1+2^-2……表示.类似的式子2.0-1.1 = 0.899999。必要时要用bigdecimal
如果数据比较多的情况下,这种方法会影响处理速度吗?[/quote]这对CPU来说都是小case,现在主要的瓶颈是传输速度更不是CPU的处理速度,所以缓存技术无处不在
姜小白- 2014-10-08
  • 打赏
  • 举报
回复
double 确实不可以,double取得只能是近似值 浮点数存储时就已经近似存储了,再计算,就更近似了
yueyuexiong 2014-10-08
  • 打赏
  • 举报
回复
引用 5 楼 sum_rain 的回复:
原因在于浮点数使用二进制表示的,小数部分用2^-1+2^-2……表示.类似的式子2.0-1.1 = 0.899999。必要时要用bigdecimal
如果数据比较多的情况下,这种方法会影响处理速度吗?
AceShot 2014-10-08
  • 打赏
  • 举报
回复
原因在于浮点数使用二进制表示的,小数部分用2^-1+2^-2……表示.类似的式子2.0-1.1 = 0.899999。必要时要用bigdecimal
yueyuexiong 2014-10-08
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
小数在计算机中都是近似存储的,两个近似存储的数据一起计算,得到的就更近似了 楼主可以给结果取近似值 或 使用

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));
得到精确值
用double不能实现吗?
yueyuexiong 2014-10-08
  • 打赏
  • 举报
回复
哦,下面的就是原来的精度啊?不好意思
yueyuexiong 2014-10-08
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
小数在计算机中都是近似存储的,两个近似存储的数据一起计算,得到的就更近似了 楼主可以给结果取近似值 或 使用

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));
得到精确值
如果我不想取近似值,我想保留原来的精度,该如何处理? 我想到的办法是根据精度截取。 有什么好用的方法吗?
姜小白- 2014-10-08
  • 打赏
  • 举报
回复
小数在计算机中都是近似存储的,两个近似存储的数据一起计算,得到的就更近似了 楼主可以给结果取近似值 或 使用

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));
得到精确值

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧