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

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类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值