double运算得到准确结果的小问题,在线等
下列表达式中,可以得到精确结果的是()
A.double d1 = 3.0 - 2.6;
B.double d4 = 2.5 * 1.5;
C.double d2 = 30/300;
D. double d3 = 1/2 + 0.5;
请大家选出结果,并说明下原因,多谢
[解决办法]
选b啊。。。
a因为double用二进制计算,因为0.6转换成二进制有精度损失,所以计算结果为0.3999999999999999
c 30/300都是整数 计算起来是0 而你付值给double 就变成了0.0
d1/2=0,然后+0.5就是0.5
[解决办法]
我觉得应该选C吧。因为C是整数。
[解决办法]
这种题目知道了答案有什么意义吗?
[解决办法]
不是说double 计算都会有失精度吗?
这样的话,只能是C啦吧!
[解决办法]
c与d一样,相除的话是都变成0的,
a貌似见过一道题在java puzzle里,不是两位结果
难道选b?
排除法
[解决办法]
因为b的2个数字是.5
计算机不能存小数点,他存的其实是2的多少次方
。5 是2的-1 所以不会丢失精确度,所以a的。6 不行
[解决办法]
个人感觉要用java对double数据的结构来分析,结果是否存在最小精度的问题
[解决办法]
/**
* 对double数据进行取精度.
* @param value double数据.
* @param scale 精度位数(保留的小数位数).
* @param roundingMode 精度取值方式.
* @return 精度计算后的数据.
*/
public static double round(double value, int scale,
int roundingMode) {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(scale, roundingMode);
double d = bd.doubleValue();
bd = null;
return d;
}
/**
* double 相加
* @param d1
* @param d2
* @return
*/
public double sum(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.add(bd2).doubleValue();
}
/**
* double 相减
* @param d1
* @param d2
* @return
*/
public double sub(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.subtract(bd2).doubleValue();
}
/**
* double 乘法
* @param d1
* @param d2
* @return
*/
public double mul(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.multiply(bd2).doubleValue();
}
/**
* double 除法
* @param d1
* @param d2
* @param scale 四舍五入 小数点位数
* @return
*/
public double div(double d1,double d2,int scale){
// 当然在此之前,你要判断分母是否为0,
// 为0你可以根据实际需求做相应的处理
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.divide
(bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
这样,计算double类型的数据计算问题就可以处理了。
另外补充一下 JavaScript 四舍五入的方法:
小数点问题
Math.round(totalAmount*100)/100 (保留 2 位)
function formatFloat(src, pos)
{
return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
}