Non-terminating decimal expansion; no exact representable decimal result(转)

Non-terminating decimal expansion; no exact representable decimal result - lopper的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lopper/article/details/5314686

由于需要处理精度比较高的浮点数,所以弃用double类型,改用BigDecimal类来进行数值处理。

在加减乘时都没有出现问题,但是到除法运算时,提示了如下错误:

大概的意思是“无法结束的除法表达式;没有精确的除结果”。我当时输入的10/3,结果应该是3.3333....333。

于是在网上找资料,发现我原来的处理方式有问题。

BigDecimal num1 = new BigDecimal("10");

BigDecimal num2 = new BigDecimal("3");

BigDecimal num3 = num1.divide(num2);

其实devide的函数定义如下

BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;

scale为小数位数;

roundingMode为小数模式;

ROUND_CEILING
如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
ROUND_DOWN
从不在舍弃(即截断)的小数之前增加数字。
ROUND_FLOOR
如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。
ROUND_HALF_DOWN
若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。
ROUND_UNNECESSARY
该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
ROUND_UP
总是在非 0 舍弃小数(即截断)之前增加数字。

写成如下便可通过

BigDecimal num3 = num1.divide(num2,10,ROUND_HALF_DOWN);

时间: 2024-10-17 04:31:21

Non-terminating decimal expansion; no exact representable decimal result(转)的相关文章

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法

今天在写一个JAVA程序的时候出现了异常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.发现报错的语句是: 1 foo.divide(bar)); 原来JAVA中如果用BigDecimal做除法的时候一定要在divide方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常.解决方法:

BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result的解决办法

今天在使用两个BigDecimal类型的数字做除法运算时,出现了一个如下的异常信息: 1 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result 上网查了一下这个异常的,找到了原因所在:通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常:java.lang.ArithmeticException: Non

java.lang.ArithmeticException: Non-terminating decimal expansion

如有需要可以加我Q群[308742428]大家一起讨论技术. 后面会不定时为大家更新文章,敬请期待. 喜欢的朋友可以关注下. 今天在写一些逻辑处理的时候,报了一个错误信息 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 原始代码: BigDecimal price = (bigprice.divide(bigdprice)).multi

Fixed-Point Types (Exact Value) - DECIMAL, NUMERIC

DECIMAL(M,D) The DECIMAL and NUMERIC types store exact numeric data values. These types are used when it is important to preserve(保存) exact precision(精度), for example with monetary data. In MySQL, NUMERIC is implemented(实现) as DECIMAL, so the followi

BigDecimal类整除报错的解决方案

例如: BigDecimal num1 = new BigDecimal("10"); BigDecimal num2 = new BigDecimal("3"); BigDecimal num3 = num1.divide(num2); 其实devide的函数定义如下 BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ; scale为小数位数: roundingM

【Java】Float计算不准确

大家可能都遇到过,float在计算某些值时,会有不准确的情况. 比如如下情况: 计算不准确 package com.nicchagil.study.java.demo.No10float计算.No01不准确的举例; public class Call { public static void main(String[] args) { System.out.println(0.08f + 0.01f); } } 打印: 0.089999996 用BigDecimal代替计算 如果需要准确计算fl

java精确计算之BigDecimal

Java中的计算主要有double,float,int,long,BigDecimal 1.float和double主要用户科学计算和工程计算,它们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而设计的.然而它们并没有提供完全精确的结果,所以不应该被用于需要精确计算的场合. eg: double double_price1 = 1.03;  double double_price2 = 0.42;  System.out.println("double的计算值:&quo

bigdecimal类型除法问题

坑:bigdecimal类型做除法运算时,结果为整数或有限小数时候不存在问题,若结果无法整除,为无限小数时报错 错误代码:Bigdecimal  b = a.divide(c).setScale(5,ROUND_HALF_DOWN); 错误提示:Non-terminating decimal expansion; no exact representable decimal result" 错误翻译:十进制小数点膨胀:没有确切的表示十进制的结果 错误原因:暂时不详 代码改进:BigDecimal

Java BigDecimal详解

1.引言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦. 先看下面代码 public static void main(String[] args) { System.out.println(0.2 + 0.1); System.out.prin