Answers:
当为
MathContext
对象提供的精度设置为0(例如MathContext.UNLIMITED
)时,算术运算是精确的,不带MathContext
对象的算术方法也是如此。(这是5之前的版本中唯一支持的行为。)作为计算精确结果的必然结果,
MathContext
不使用精度设置为0 的对象的舍入模式设置,因此不相关。在除法的情况下,精确的商可能具有无限长的十进制扩展;例如1除以3。如果商具有不间断的十进制扩展数,并且指定了该操作以返回精确的结果,
ArithmeticException
则会引发an 。否则,将返回除法的精确结果,就像其他操作一样。
要解决此问题,您需要执行以下操作:
a.divide(b, 2, RoundingMode.HALF_UP)
其中2是小数位数,RoundingMode.HALF_UP是四舍五入模式
有关更多详细信息,请参阅此博客文章。
你可以做
a.divide(b, MathContext.DECIMAL128)
您可以选择想要的位数32、64、128。
查看此链接:
为了解决这个问题,我使用了以下代码
a.divide(b, 2, RoundingMode.HALF_EVEN)
2是精度。现在问题已解决。
我遇到了同样的问题,因为我的代码行是:
txtTotalInvoice.setText(var1.divide(var2).doubleValue() + "");
我改为之前阅读的答案,因为我没有写十进制精度:
txtTotalInvoice.setText(var1.divide(var2,4, RoundingMode.HALF_UP).doubleValue() + "");
4是十进制精度
AND RoundingMode是Enum常数,您可以选择任何一个
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
在这种情况下,HALF_UP将具有以下结果:
2.4 = 2
2.5 = 3
2.7 = 3
您可以在RoundingMode
此处查看信息:http : //www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/
这是将结果取整的问题,以下是我的解决方案。
divider.divide(dividend,RoundingMode.HALF_UP);
BigDecimal的答案引发ArithmeticException
public static void main(String[] args) {
int age = 30;
BigDecimal retireMentFund = new BigDecimal("10000.00");
retireMentFund.setScale(2,BigDecimal.ROUND_HALF_UP);
BigDecimal yearsInRetirement = new BigDecimal("20.00");
String name = " Dennis";
for ( int i = age; i <=65; i++){
recalculate(retireMentFund,new BigDecimal("0.10"));
}
BigDecimal monthlyPension = retireMentFund.divide(
yearsInRetirement.divide(new BigDecimal("12"), new MathContext(2, RoundingMode.CEILING)), new MathContext(2, RoundingMode.CEILING));
System.out.println(name+ " will have £" + monthlyPension +" per month for retirement");
}
public static void recalculate (BigDecimal fundAmount, BigDecimal rate){
fundAmount.multiply(rate.add(new BigDecimal("1.00")));
}
在您的除法方法调用中添加MathContext对象,并调整精度和舍入模式。这应该可以解决您的问题
您的程序不知道使用十进制数字的精度,因此它抛出:
java.lang.ArithmeticException: Non-terminating decimal expansion
MathContext precision = new MathContext(int setPrecisionYouWant); // example 2
BigDecimal a = new BigDecimal("1.6",precision);
BigDecimal b = new BigDecimal("9.2",precision);
a.divide(b) // result = 0.17