当前位置: 首页 > 知识库问答 >
问题:

计算MPG结果在java.lang.算术异常:非终止小数展开;没有确切的表示小数结果[重复]

姚星宇
2023-03-14

代码:

import java.util.Scanner;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class MPGAppBigDecimal
{
    public static void main(String[] args)
    {
        System.out.println("Welcome to the Miles Per Gallon Calculator.");
        System.out.println();

        Scanner sc = new Scanner(System.in);
        String choice = "y";

        while (choice.equalsIgnoreCase("y"))
        {
            // get the miles driven from the user
            System.out.print("Enter miles driven: ");
            String milesString = sc.next();

            // get the gallons of gas used
            System.out.print("Enter gallons of gas used: ");
            String gallonsString = sc.next();

            // calculating miles per gallons
            BigDecimal miles = new BigDecimal(milesString);
            BigDecimal gallons = new BigDecimal(gallonsString);

            BigDecimal mpg = miles.divide(gallons).setScale(2, RoundingMode.HALF_UP);

            // display the result
            System.out.println("Miles per gallon is " + mpg.toString() + ".");
            System.out.println();

            // see if the user wants to continue
            System.out.print("Calculate another MPG? (y/n): ");
            choice = sc.next();
            System.out.println();
        }
    }
}

当我输入十进制值时,它抛出一个异常:线程“主”中的异常java.lang.算术异常:非终止十进制扩展;没有确切的可表示的十进制结果。

共有1个答案

傅茂实
2023-03-14

BigDecimal的java文档:

当MathContext对象的精度设置为0(例如,MathContext.UNLIMITED)时,算术运算是精确的,不接受MathContext对象的算术方法也是精确的。(这是5之前的版本中唯一支持的行为。)作为计算精确结果的必然结果,不使用精度设置为0的MathContext对象的舍入模式设置,因此不相关。在除法的情况下,精确的商可以有无限长的十进制展开式;例如,1除以3。如果商具有非终止十进制扩展,并且指定该操作以返回精确结果,则会引发算术异常。否则,将返回除法的确切结果,就像其他操作一样。

在代码中:

miles.divide(gallons)

您在不定义刻度和检索此错误的情况下将英里除以加仑,因为您正在使用公共BigDecimal除法(BigDecimal divisor)方法,该方法使用un无限精度。

返回一个BigDecimal,其值为(this/divisor),首选小数位数为(this.scale()-divisor)。比例();如果无法表示精确的商(因为它有一个非终止的十进制扩展),将引发算术异常。

使用除法(大十进制除数、整数刻度、舍入模式和舍入模式)代替:

返回一个BigDecimal,该BigDecimal的值为(this/divisor),并且其比例与指定的比例相同。如果必须执行舍入以生成具有指定比例的结果,则应用指定的舍入模式。

具体如下:

miles.divide(gallons, 2, RoundingMode.HALF_UP);  
 类似资料: