Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 算术例外:“;非终止十进制扩展;无可精确表示的十进制结果”;_Java_Bigdecimal_Arithmeticexception - Fatal编程技术网

Java 算术例外:“;非终止十进制扩展;无可精确表示的十进制结果”;

Java 算术例外:“;非终止十进制扩展;无可精确表示的十进制结果”;,java,bigdecimal,arithmeticexception,Java,Bigdecimal,Arithmeticexception,为什么下面的代码会引发如下所示的异常 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

为什么下面的代码会引发如下所示的异常

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.
从:

MathContext
对象的精度设置为0(例如,)时,算术运算是精确的,不接受
MathContext
对象的算术方法也是精确的。(这是5之前的版本中唯一支持的行为。)

作为计算精确结果的推论,不使用精度设置为0的
MathContext
对象的舍入模式设置,因此不相关。在除法的情况下,精确的商可以有无限长的十进制展开式;例如,1除以3

如果商具有非终止十进制扩展,并且指定该操作以返回精确结果,则会引发
算术异常。否则,将返回除法的精确结果,与其他操作一样

要解决此问题,您需要执行以下操作:

a.divide(b, 2, RoundingMode.HALF_UP)
其中2为比例和舍入模式。半向上为舍入模式


有关详细信息,请参见。

,因为您没有指定精度和舍入模式。BigDecimal抱怨它可能使用10、20、5000或无限小数位,但它仍然无法给出数字的精确表示。因此,它不是给你一个错误的大十进制,而是在向你抱怨

但是,如果您提供一个RoundingMode和一个精度,那么它将能够转换(例如,1.333到无穷大到1.3333…但是作为程序员,您需要告诉它您“满意”的精度。

您可以这样做

a.divide(b, MathContext.DECIMAL128)
您可以选择所需的位数32,64128

查看此链接:


我也有同样的问题,因为我的代码行是:

txtTotalInvoice.setText(var1.divide(var2).doubleValue() + "");
我在阅读之前的答案时改变了这一点,因为我没有写十进制精度:

txtTotalInvoice.setText(var1.divide(var2,4, RoundingMode.HALF_UP).doubleValue() + "");
4是十进制精度

和RoundingMode是枚举常量,您可以选择其中任何一个
上、下、天花板、地板、半下、半平、半上

在这种情况下,一半以上将产生以下结果:

2.4 = 2   
2.5 = 3   
2.7 = 3

您可以在此处查看
RoundingMode
信息:

,以解决我在下面代码中使用的问题

a.divide(b, 2, RoundingMode.HALF_EVEN)
2是精度。现在问题已解决。

答案为

publicstaticvoidmain(字符串[]args){
年龄=30岁;
BigDecimal退休基金=新的BigDecimal(“10000.00”);
退休基金。设置刻度(2,大十进制。四舍五入半);
BigDecimal yearsInRetirement=新的BigDecimal(“20.00”);
String name=“Dennis”;

对于(int i=age;i您的程序不知道十进制数的精度,因此它抛出:

java.lang.ArithmeticException: Non-terminating decimal expansion
绕过异常的解决方案:
这是一个四舍五入结果的问题,我的解决方案如下

divider.divide(dividend,RoundingMode.HALF_UP);

对我来说,这是一个:

BigDecimal a = new BigDecimal("9999999999.6666",precision);
BigDecimal b = new BigDecimal("21",precision);

a.divideToIntegralValue(b).setScale(2)

这也适用于jasper错误,因为2不是
精度
;它是
比例
。请参阅(新的BigDecimal(100))。除法(新的BigDecimal(0.90),2,取整模式。上半部分)@AnandVarkeyPhilips这是比例。请参见.Edit被拒绝。@user207421,我不小心编辑了它并尝试还原..但没有足够的点数删除编辑..除了代码,还应该提供一些解释。2不是
精度
;它是
比例
。请参见RoundingMode.HALF\u甚至建议fina使用ncial应用程序。这是在银行中使用的。对于那些对约翰·曼科斯关于精度的评论感到困惑的人,请看这个答案4是刻度,而不是精度。如果我想要后面的2位小数,如何使用MatchContext实现?
divider.divide(dividend,RoundingMode.HALF_UP);
BigDecimal a = new BigDecimal("9999999999.6666",precision);
BigDecimal b = new BigDecimal("21",precision);

a.divideToIntegralValue(b).setScale(2)