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)