• 全部
  • Java SE
  • Java EE
  • J2ME
  • IDE工具
  • 求助
  • 内推招聘
  • 问答

Java double 类型除法

xgpengfei 2012-07-27 04:31:54
今天在测试double类型mod运算时意外遇到一个问题:
当两个doublel类型数据做除法运算,或者做mod运算时,结果精度有问题。
比如:
System.out.println(0.6/0.2);
输出结果不是预料中的3.0
而是:2.9999999999999996
做mod元算也是出现同样的问题。
然后我又用其他数据做了相应的测试,发现当除法运算结果为3.0时,结果的精度就会出现异常,
求解答。
...全文
1533 1 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xgpengfei 2012-08-01
后来仔细想了一下,正如六楼所述。。。
总结如下,如果精度要求不高的话可做一下格式化处理:
d=0.3;
System.out.println(String.format("%g",d));
要求高精度的话就用BigDecimal来计算了。
感谢各位了。
回复
VanBaston 2012-07-30
计算机中存储数字是用2进制表示的,所有在存储double类型的数据并不能精确到0.1,所以在用double做操作的时候会因为精度问题出现一些和实际不一样的结果。
你要求精度很高的话就用BigDecimal来计算
回复
yijiulove 2012-07-30
转换成BigDecimal
回复
土圭垚 2012-07-30
/**
* @param v1
* @param v2
* @param scale 对结果保留几位小数
* @return
*/
public static double divide(double v1, double v2,int scale) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale).doubleValue();
}

BigDecimal提供了加、减、乘、除的方法,直接调用就可以了,其他的方法可以查看Api。
回复
菖蒲芭芭 2012-07-30
浮点数运算最好用BigDecimal来计算。。。
回复
cjhuaxin 2012-07-30
楼上说错了吧,java中带小数点的默认是double,这应该是java编译器的问题,就像System.out.print(2.0-1.1);输出结果不是0.9,是0.8999999999999999,如果你这样输出System.out.printf("%.1f",2.0-1.1);输出结果就是0.9,再具体的原因我也不知道了,期待牛人来回答!
回复
leandzgc 2012-07-27
这样直接相除应该是不行的。他们默认应该是float类型的。给你2个方法你都试验一下。
第一种:定义两个变量保存这两个值,然后用变量计算。

/**
* 两个Double数相除,并保留scale位小数
* @param v1
* @param v2
* @param scale
* @return Double
*/
public static Double div(Double v1,Double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}


http://www.zhuoda.org/weiking/86848.html这个是地址
第二种:如果你确认你的小数位的话,那么你把小数位先变为整数,然后运算,怎么感觉第二种方法适用于小数相乘啊?因为我自己写了段代码怎么运算都不对啊,哈哈!
回复
相关推荐
发帖
Java
创建于2007-09-28

4.7w+

社区成员

Java相关技术讨论
申请成为版主
帖子事件
创建了帖子
2012-07-27 04:31
社区公告
暂无公告