您的位置:首页 > 编程语言 > Java开发

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exac

2017-02-18 14:22 423 查看
1、错误描述
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1616)
at com.you.model.AddSubMulDiv.addSubMulDiv(AddSubMulDiv.java:59)
at com.you.model.AddSubMulDiv.main(AddSubMulDiv.java:81)
2、错误原因
/**
*
* 项目名称:DABF
* 项目包名:com.you.model
* 文件名称:AddSubMulDiv.java
* 类型名称:AddSubMulDiv
* 创建作者:游海东
* 创建日期:2017-2-18
* 创建时间:上午9:10:27
* 版权所有:
* 项目版本:V1.0
*/
package com.you.model;

import java.math.BigDecimal;

/**
* BigDecimal加减乘除
* 文件名称:AddSubMulDiv.java
* 文件类型:AddSubMulDiv
* 文件包名:com.you.model
* 创建作者:游海东
* 创建日期:2017-2-18
* 创建时间:上午9:10:27
*/
public class AddSubMulDiv
{
/**
*
* 方法描述:加减乘除
* 创建作者:游海东
* 创建日期:2017-2-18
* 创建时间:上午9:12:53
* 方法名称:addSubMulDiv
* 方法类型:AddSubMulDiv
* 返回类型:BigDecimal
* @param anum
* @param bnum
* @param type
* @return
*/
public static BigDecimal addSubMulDiv(double anum,double bnum,String type)
{
BigDecimal oneNum = new BigDecimal(anum);
BigDecimal twoNum = new BigDecimal(bnum);
BigDecimal resultNum = new BigDecimal(0);
switch(type)
{
case "ADD":
resultNum = oneNum.add(twoNum);
break;
case "SUB":
resultNum = oneNum.subtract(twoNum);
break;
case "MUL":
resultNum = oneNum.multiply(twoNum);
break;
case "DIV":
resultNum = oneNum.divide(twoNum);
break;
default:
break;
}
resultNum = resultNum.setScale(2,BigDecimal.ROUND_HALF_UP);

return resultNum;
}

/**
* 方法描述:加减乘除测试
* 创建作者:游海东
* 创建日期:2017-2-18
* 创建时间:上午9:10:28
* 方法名称:main
* 方法类型:AddSubMulDiv
* 返回类型:void
* @param args
*/
public static void main(String[] args)
{
BigDecimal sumNum = addSubMulDiv(667.53, 227.89, "DIV");
System.out.println(sumNum);
}

}            由于传入的两个操作数都是double类型,在做除法运算时导致除不尽,无限不循环小数,导致报错

3、解决办法
(1)除法运算时,将结果四舍五入处理
(2)将两个操作数改成String类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐