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时,结果的精度就会出现异常,
求解答。
...全文
4158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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这个是地址
第二种:如果你确认你的小数位的话,那么你把小数位先变为整数,然后运算,怎么感觉第二种方法适用于小数相乘啊?因为我自己写了段代码怎么运算都不对啊,哈哈!

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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