求教大伙个小问题,关于BigDecimal类的divide()..................

棒棒不是糖_ 2012-09-16 03:33:29

import java.math.*;
public class Test {
public static void main(String[] args) {
BigDecimal a=new BigDecimal(0.5);
BigDecimal b=new BigDecimal(0.2);
System.out.println(a.divide(b));
}
}



报错········
我表示不是很理解,如果为5 和 2的话,完全没有问题。
...全文
340 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
leokelly001 2013-04-14
  • 打赏
  • 举报
回复
正用他呢,多谢啦
rockets311 2012-09-17
  • 打赏
  • 举报
回复
好像问题不在String与double,我试过,用String还是会报错的。
棒棒不是糖_ 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
无穷的十进制扩展,我的理解是无限位数的小数,例如0.33333……,所以1和3也是会报错的
0.5和0.2可以是因为这个商的位数是有限的。
可以用public BigDecimal divide(BigDecimal divisor,int roundingMode)去解决。
例如:

Java code

BigDecimal a = new BigDecimal(0.5)……
[/Quote]

嗯,知道了。问题出在,实例化BigDecimal时,建议使用的是String类型,不用double,这样就可以解决了。。。
棒棒不是糖_ 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
BigDecimal 使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;

建议使用:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
[/Quote]
嗯,知道了。问题出在,实例化BigDecimal时,参数建议使用的是String类型,不用double,这样就可以解决了。。。
ddplayer12 2012-09-16
  • 打赏
  • 举报
回复
BigDecimal类的主要功能是进行小数的大数计算,而且最重要的是可以精确到指定的四舍五入位数。
如果要进行四舍五入的操作,则必须依靠以下的方法:
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
scale:表示四舍五入的位数
roundingMode:四舍五入的操作模式,一般用ROUND_HALF_UP

以下是例子

import java.math.BigDecimal;

class MyMath {
public static double add(String num1, String num2) {
BigDecimal bd1 = new BigDecimal(num1);
BigDecimal bd2 = new BigDecimal(num2);
return bd1.add(bd2).doubleValue();
}

public static double sub(String num1, String num2) {
BigDecimal bd1 = new BigDecimal(num1);
BigDecimal bd2 = new BigDecimal(num2);
return bd1.subtract(bd2).doubleValue();
}

public static double mul(String num1, String num2) {
BigDecimal bd1 = new BigDecimal(num1);
BigDecimal bd2 = new BigDecimal(num2);
return bd1.multiply(bd2).doubleValue();
}

public static double div(String num1, String num2, int scale) {
BigDecimal bd1 = new BigDecimal(num1);
BigDecimal bd2 = new BigDecimal(num2);
return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

public static double round(double num, int scale) {
BigDecimal bd1 = new BigDecimal(num);
BigDecimal bd2 = new BigDecimal(1);
return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}

public class BigDecimalDemo {
public static void main(String[] args) {
String num1 = "12345.07891";
String num2 = "3333.5101";
System.out.println("加法操作:" + MyMath.round(MyMath.add(num1, num2), 2));
System.out.println("减法操作:" + MyMath.round(MyMath.sub(num1, num2), 2));
System.out.println("乘法操作:" + MyMath.round(MyMath.mul(num1, num2), 2));
System.out.println("除法操作:" + (MyMath.div(num1, num2, 2)));
}
}
zhanglujie2008 2012-09-16
  • 打赏
  • 举报
回复
BigDecimal 使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;

建议使用:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
rockets311 2012-09-16
  • 打赏
  • 举报
回复
无穷的十进制扩展,我的理解是无限位数的小数,例如0.33333……,所以1和3也是会报错的
0.5和0.2可以是因为这个商的位数是有限的。
可以用public BigDecimal divide(BigDecimal divisor,int roundingMode)去解决。
例如:
	BigDecimal a = new BigDecimal(0.5);
BigDecimal b = new BigDecimal(0.2);
BigDecimal c = a.divide(b,BigDecimal.ROUND_HALF_EVEN);
System.out.println(c);

至于为什么报错,我也跟踪了一下BigDecimal的源码,比较麻烦,就没再研究了,呵呵。。。
棒棒不是糖_ 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
看了一下这个方法的说明:

Java code

Returns a BigDecimal whose value is (this / divisor), and whose preferred scale is (this.scale() - divisor.scale()); if the exact quotient cannot be represented (because i……
[/Quote]

确切的值?
为什么0.5 0.2 就不可以,而0.5 0.25 就可以?
郁闷啊。
无穷的十进制扩展又是什么意思?
能请教下么?
rockets311 2012-09-16
  • 打赏
  • 举报
回复
看了一下这个方法的说明:
Returns a BigDecimal whose value is (this / divisor), and whose preferred scale is (this.scale() - divisor.scale()); if the exact quotient cannot be represented (because it has a non-terminating decimal expansion) an ArithmeticException is thrown.

抛异常应该就是因为它不能找到一个确切的值去表示这个商值。

62,614

社区成员

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

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