BigDecimal精度问题

yegaofei 2010-07-23 10:51:29
代码如下 :

public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(309152225.04);
BigDecimal b2 = new BigDecimal(10211943.49);
BigDecimal b3 = new BigDecimal(10211943.49);
BigDecimal b4 = new BigDecimal(0);
BigDecimal b5 = new BigDecimal(0);
BigDecimal b6 = new BigDecimal(10211943.49);
BigDecimal b7 = new BigDecimal(10211943.49);
BigDecimal b8 = new BigDecimal(1);

BigDecimal b9 = b1.add(b2).add(b3).add(b4).add(b5).add(b6).add(b7).add(b8);

System.out.println(b9);
}


输出结果是:
350000000.00000002235174179077148437500

正确的结果应该是:
350000000


为什么后面会多出这么多数字呢?是不是在调用add方法时还需要加入其他参数?
...全文
194 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuzeitou 2010-07-23
  • 打赏
  • 举报
回复
以上输出结果为350000000.00

尽量以String为参数构造,因为double的精度问题

System.out.println(new BigDecimal(309152225.04));
这个的结果是309152225.040000021457672119140625
yegaofei 2010-07-23
  • 打赏
  • 举报
回复
对,对,很久没用都忘记了,应该用string

谢谢
valen_jia 2010-07-23
  • 打赏
  • 举报
回复
可以在加的时候设置精度,也可以最后设置一下
具体看API

最后设置帮你写了下
System.out.println(b9.divide(new BigDecimal(1),2, BigDecimal.ROUND_HALF_UP));
yao2007 2010-07-23
  • 打赏
  • 举报
回复
import java.math.*;
public class Test
{
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(309152225.04);
BigDecimal b2 = new BigDecimal(10211943.49);
BigDecimal b3 = new BigDecimal(10211943.49);
BigDecimal b4 = new BigDecimal(0);
BigDecimal b5 = new BigDecimal(0);
BigDecimal b6 = new BigDecimal(10211943.49);
BigDecimal b7 = new BigDecimal(10211943.49);
BigDecimal b8 = new BigDecimal(1);
BigDecimal b9 = b1.add(b2).add(b3).add(b4).add(b5).add(b6).add(b7).add(b8);
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
System.out.println(b5);
System.out.println(b6);
System.out.println(b7);
System.out.println(b8);
System.out.println(b9);
}
}

BigDecimal的构造函数用double在转化的时候已经变了,构造函数一般还是用String作为参数好,double转成二进制表示的时候未必能精确表示的。
zhuzeitou 2010-07-23
  • 打赏
  • 举报
回复
	public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("309152225.04");
BigDecimal b2 = new BigDecimal("10211943.49");
BigDecimal b3 = new BigDecimal("10211943.49");
BigDecimal b4 = new BigDecimal("0");
BigDecimal b5 = new BigDecimal("0");
BigDecimal b6 = new BigDecimal("10211943.49");
BigDecimal b7 = new BigDecimal("10211943.49");
BigDecimal b8 = new BigDecimal("1");

BigDecimal b9 = b1.add(b2).add(b3).add(b4).add(b5).add(b6).add(b7).add(
b8);

System.out.println(b9);
}

62,614

社区成员

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

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