This question already has answers here:
ArithmeticException: “Non-terminating decimal expansion; no exact representable decimal result”
(9个答案)
2年前关闭。
码:
当我输入十进制值时,将引发异常:
线程“主”中的异常java.lang.ArithmeticException:非终止的十进制扩展;没有确切可表示的十进制结果。
您正在用加仑除以英里数,而未定义比例并检索此错误,因为使用的方法
返回一个BigDecimal,其值为(this / divisor),并且首选比例为(this.scale()-divisor.scale());。如果无法表示确切的商(因为它具有无终止的十进制扩展),则抛出ArithmeticException。
使用
返回一个BigDecimal,其值为(this / divisor),其小数位数已指定。如果必须进行舍入以产生具有指定比例的结果,则将应用指定的舍入模式。
如下:
(9个答案)
2年前关闭。
码:
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:非终止的十进制扩展;没有确切可表示的十进制结果。
最佳答案
从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);
关于java - 计算MPG会导致java.lang.ArithmeticException:非终止的十进制扩展;没有确切可表示的十进制结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53836351/
10-13 03:23