为什么下面的代码会引发如下所示的异常?
BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.
例外情况:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
你能行
a.divide(b, MathContext.DECIMAL128)
您可以选择所需的位数:32、64或128。
查看此链接:
http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6
因为您没有指定精度和舍入模式。BigDecimal抱怨它可能会使用10、20、5000或无限小数位,但它仍然无法给出数字的精确表示。因此,它不是给你一个错误的大小数,而是在抱怨你。
然而,如果你提供一个RoundingMode和一个精度,那么它将能够转换(例如,1.333到无穷大到1.3333…但是作为程序员,你需要告诉它你“满意”的精度。
从Java 11BigDecimal
docs:
当MathContext
对象的精度设置为0(例如,MathContext.UNLIMITED
)时,算术运算是精确的,不接受MathContext
对象的算术方法也是精确的。(这是5之前的版本中唯一支持的行为。)
作为计算精确结果的必然结果,不使用精度设置为0的MathContext
对象的舍入模式设置,因此无关紧要。在除法的情况下,精确商数可以有无限长的十进制扩展;例如,1除以3。
如果商具有非终止十进制扩展,并且指定该操作以返回精确结果,则会引发算术异常
。否则,将返回除法的确切结果,就像其他操作一样。
要修复,你需要做这样的事情:
a.divide(b, 2, RoundingMode.HALF_UP)
其中2是比例和圆化模式。半向上是四舍五入模式
有关更多详细信息,请参阅本文。
代码: 当我输入十进制值时,它抛出一个异常:线程“主”中的异常java.lang.算术异常:非终止十进制扩展;没有确切的可表示的十进制结果。
我的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)。
将数字四舍五入到指定的小数位数。 使用 Math.round() 和模板字面量将数字四舍五入为指定的小数位数。 省略第二个参数 decimals ,数字将被四舍五入到一个整数。 const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); round(1.005, 2);