double运算的精度问题

liuzuowei007 2013-07-08 04:36:46

import java.math.BigDecimal;

public class TestDouble {
public static void main(String[] args) {
double d1 = div(20130708154752d,1000000000000d);
double d2 = 16000d;
System.out.println(d1);
System.out.println(sum(d1,d2));
}

public static 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();
}

public static double div(double v1,double v2){
return div(v1,v2,12);
}

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(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}



运行结果是:
20.130708154752
16020.130708154751

如何能避免精度损失的问题?
...全文
273 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2013-07-09
  • 打赏
  • 举报
回复
精度损失,几乎无法避免,只能控制在某个范围内。 例如,财会做账,我们通常以分为单位,而不是元,这样避免浮点数的精度损失。 但是,如果做平均数、方差之类的运算 ,还是会产生精度损失,这时就只能控制精度。 BigDecimal 是高精度的浮点数,通过这个类封装过后,可以处理高精度的数字。 计算机存储的是二进制数字,所以,保存十进制数据时,有时候也会产生误差。 所以,我们应该关注误差的大小,控制在我们能接收的范围就好。 还要注意误差传递的问题。
liuzuowei007 2013-07-09
  • 打赏
  • 举报
回复
就是说想维持上述的需求的情况下使用double就必然会有误差并且不能避免是吗?
  • 打赏
  • 举报
回复
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();divide提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入(BigDecimal.ROUND_HALF_UP)。 你说的损失是存在的。
「已注销」 2013-07-08
  • 打赏
  • 举报
回复
一直用BigDecimal,结果是准确的。 用double转其他类型的时候,已经存在误差了。
lcf 2013-07-08
  • 打赏
  • 举报
回复
只能不用double了

62,614

社区成员

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

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