解决java.math.BigDecimal divide方法运算结果为无限小数问题

http://samueli.iteye.com/blog/224755
BigDecimal除法运算报错,错误如下:
Non-terminating decimal expansion; no exact representable decimal result

原因是:

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

if divisor is zero, roundingMode==ROUND_UNNECESSARY and the specified scale is insufficient to represent the result of the division exactly
所以使用divide时应该指定scale和roundingMode,保证对于无限小数有足够的范围来表示结果。

问题扩展:

BigDecimal divide方法结果为无限小数问题

10/3=3.3333333333333333..............

Java代码  

  1. public static void main(String[] args) {
  2. BigDecimal a = new BigDecimal("10");
  3. BigDecimal o = new BigDecimal("3");
  4. System.out.print(a.divide(o).setScale(2, BigDecimal.ROUND_DOWN).doubleValue());
  5. }

Java代码

  1. Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
  2. at java.math.BigDecimal.divide(BigDecimal.java:1514)
  3. at test.main(test.java:8)

解决方法:

Java代码

  1. public static void main(String[] args) {
  2. BigDecimal a = new BigDecimal("10");
  3. BigDecimal o = new BigDecimal("3");
  4. System.out.print(a.divide(o,2, BigDecimal.ROUND_DOWN).doubleValue());
  5. }

输出:3.33

需要注意的地方:

Java代码

  1. /**
  2. * (1)BigInteger和BigDecimal都是不可变(immutable)的,在进行每一步运算时,都会产生一个新的对象,由于创建对象会引起开销,
  3. * 它们不适合于大量的数学计算,应尽量用long,float,double等基本类型做科学计算或者工程计算。
  4. * 设计BigInteger和BigDecimal的目的是用来精确地表示大整数和小数,使用于在商业计算中使用。
  5. * (2)BigDecimal有4个够造方法,其中的两个用BigInteger构造,另一个是用double构造,还有一个使用String构造。
  6. * 应该避免使用double构造BigDecimal,因为:有些数字用double根本无法精确表示,传给BigDecimal构造方法时就已经不精确了。
  7. * 比如,new BigDecimal(0.1)得到的值是0.1000000000000000055511151231257827021181583404541015625。
  8. * 使用new BigDecimal("0.1")得到的值是0.1。因此,如果需要精确计算,用String构造BigDecimal,避免用double构造,尽管它看起来更简单!
  9. * (3)equals()方法认为0.1和0.1是相等的,返回true,而认为0.10和0.1是不等的,结果返回false。
  10. * 方法compareTo()则认为0.1与0.1相等,0.10与0.1也相等。所以在从数值上比较两个BigDecimal值时,应该使用compareTo()而不是 equals()。
  11. * (4)另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1除以9会产生无限循环的小数 .111111...。
  12. * 出于这个原因,在进行除法运算时,BigDecimal可以让您显式地控制舍入。
  13. */

实战:

比如:

//声明d,无论哪一种声明方式结果都是一样的,数字超过8位就有问题,跟double长度有关

Double d = 22722222.0;

//Double d = Double.parseDouble("22722222.0");

//Double d = Double.valueOf("22722222.0");

//Double d = new Double("22722222.0");

//输出d结果

System.out.println(d.toString());

结果:2.2722222E7

2.2722222E7!计算条件若是错误的,计算结果怎么都会错啊

时间: 2024-12-29 11:11:50

解决java.math.BigDecimal divide方法运算结果为无限小数问题的相关文章

【java】Java.math.BigDecimal.subtract()方法实例

java.math.BigDecimal.subtract(BigDecimal subtrahend) 返回一个BigDecimal,其值为 (this - subtrahend), 精度为 max(this.scale(), subtrahend.scale()). 声明 以下是声明java.math.BigDecimal.subtract()方法 public BigDecimal subtract(BigDecimal subtrahend) 参数: subtrahend - 此BigD

BigDecimal.divide方法

java.math.BigDecimal.divide(BigDecimal divisor, int roundingMode) 返回一个BigDecimal,其值为(this/除数),其标度是this.scale().如果必须执行舍入,以产生一个结果与给定的比例,将指定的舍入模式被应用. 声明 以下是java.math.BigDecimal.divide()方法的声明 public BigDecimal divide(BigDecimal divisor, int roundingMode)

java.math.BigDecimal保留两位小数,保留小数,精确位数

http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现 java保留两位小数问题: 方式一(四舍五入形式保留两位小数,注意模式ROUND_HALF_UP): 四舍五入   double   f   =   111231.5585;   BigDecimal   b   =   new   BigDecimal(f);   double   f1   =   b.setScale(2

java.math.BigDecimal类的用法

在java中提供了大数字的操作类,即java.math.BinInteger类和java.math.BigDecimal类.这两个类用于高精度计 算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类.下边我们介绍BigDecimal类: BigDecimal的实现利用到了BigInteger,不同的是BigDecimal加入了小数的概念.一般的float型和Double型数据只可 以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高

java.math.BigDecimal

java在运行1.0-0.8时,其结果并不是0.2,而是0.1999999999999996.这是因为 java遵守IEEE754浮点数运算(Floating-pointarithmetic)规范,使用分数与 指数来表示浮点数.例如,0.5会使用1/2来表示,0.75会使用1/2+1/4来表示, 0.875会使用1/2+1/4+1/8来表示,而0.1会使用 1/16+1/32+1/256+1/512+1/4096+1/8192+...无限循环下去,无法精确的表示, 因而造成运算上的误差. 再例如

数据转换bug花了半天时间 Java.math.BigDecimal cannot be cast to java.lang.String

从数据库取出一个 Count函数 统计的值 在代码中要转成Integer类型的时候 Integer.parseInt((String)map.get("ID_")) 报了一下错误: Java.math.BigDecimal cannot be cast to java.lang.String 解决方法: Object ob = map.get("ID_");先将数据转成 Integer.parseInt(ob.toString()); http://blog.csd

java.math.BigDecimal类multiply的使用

其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算.在使用BigDecimal类来进行计算的时候,主要分为以下步骤:1.用float或者double变量构建BigDecimal对象.2.通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算.3.把BigDecimal对象转换成float,double,int等类型.一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf

MySQL分段统计SQL写法 与 Mybatis 报错:java.math.BigDecimal cannot be cast to java.lang.Integer

mysql> select -> sum(case when score<60 then 1 else 0 end) as '<60', -> sum(case when score>=60 and score<=69 then 1 else 0 end) as '60~69', -> sum(case when score>=70 and score<=79 then 1 else 0 end) as '70~79', -> sum(ca

java.lang.ClassCastException:java.math.BigDecimal cannot be cast to java.lang.String

1.错误描述 2.错误原因 在hibernate映射文件中,数据库字段id是字符串类型,而在Java封装类中定义成java.math.BigDecimal,导致出错 3.解决办法 将Java封装类中的id属性修改成String类型