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取得只能是近似值
浮点数存储时就已经近似存储了,再计算,就更近似了
------解决思路----------------------
这对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一样有除不尽的时候,所以会出现那种情况