【问题标题】:Calculating MPG results in java.lang.ArithmeticException: Non terminating decimal expansion; no exact representable decimal result [duplicate]计算 MPG 导致 java.lang.ArithmeticException: 非终止十进制扩展;没有精确可表示的十进制结果[重复]
【发布时间】:2019-05-19 01:36:38
【问题描述】:

代码:

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.ArithmeticException 中的异常:非终止十进制扩展;没有精确可表示的十进制结果。

【问题讨论】:

  • 你提供什么输入?

标签: java


【解决方案1】:

来自BigDecimal的java文档:

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

在代码中:

miles.divide(gallons)

您在没有定义比例的情况下将英里除以加仑并检索此错误,因为您使用的方法public BigDecimal divide(BigDecimal divisor) 使用了无限精度。

返回一个 BigDecimal,其值为 (this / divisor),其首选比例为 (this.scale() - divisor.scale()); 如果无法表示确切的商(因为它具有非终止的十进制扩展),则会引发 ArithmeticException

改用divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

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

如下:

miles.divide(gallons, 2, RoundingMode.HALF_UP);  

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多