代码:
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.算术异常:非终止十进制扩展;没有确切的可表示的十进制结果。
从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);
为什么下面的代码会引发如下所示的异常? 例外情况:
我的java代码在HP-UX hpdev B.11.23 U ia64上运行,有时会产生以下异常:java。算术异常:非终止十进制扩展;没有可精确表示的十进制结果。 导致它的代码: 记录是一个简单的sql查询中列值的集合。p_change来自Oracle数据库中的表,其中列为NUMBER(10,2)。 我明白为什么会这样。频率是随机的,有时会用相同的数据进行细分。我只是想知道这是否与硬件有关。
我参考了这一点,并对值进行了四舍五入,然后我也得到了上述错误。请查找下面提到的代码。提前感谢:
问题内容: 为什么以下代码会引发如下所示的异常? 例外: 问题答案: 从Java 11 BigDecimal文档: 当为对象提供的精度设置为0(例如MathContext.UNLIMITED)时,算术运算是精确的,不带对象的算术方法也是如此。(这是5之前的版本中唯一支持的行为。) 作为计算精确结果的必然结果,不使用精度设置为0 的对象的舍入模式设置,因此不相关。在除法的情况下,精确的商可以具有无限
我得到以下例外: 为什么会这样?除法的结果应该是729.75,它有一个终止的十进制扩展(.75)。
问题内容: 我需要在Java中执行一些浮点运算,如下面的代码所示: 这是为了模拟Betfair Spinner小部件作为输出给出的值的范围。 Java中的浮点算术似乎引入了一些意外错误。例如,我得到2.180000000000001而不是2.18。浮点数有什么用,您不相信对它们执行的算术结果吗?我该如何解决这个问题? 问题答案: 如果您需要精确的十进制值,则应使用java.math.BigDeci