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,保证对于无限小数有足够的范围来表示结果。

 
 
问题扩展:
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!计算条件若是错误的,计算结果怎么都会错啊

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

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

    java.math.BigDecimal.subtract(BigDecimal subtrahend) 返回一个BigDecimal,其值为 (this - subtrahend), 精度为 max ...

  2. Java.math.BigDecimal.abs()方法

    java.math.BigDecimal.abs()返回一个BigDecimal,其值是此BigDecimal的绝对值,其标度是this.scale(). 声明 以下是java.math.BigDec ...

  3. BigDecimal.divide方法

    java.math.BigDecimal.divide(BigDecimal divisor, int roundingMode) 返回一个BigDecimal,其值为(this/除数),其标度是th ...

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

    http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现   java保留两位小数问题 ...

  5. java.math.BigDecimal类

    BigDecimal类用于高精度计算.一般的float型和Double型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecima ...

  6. java.math.BigDecimal()的用法

    Java中简单的浮点数类型float和double是不能进行运算的,不光Java,很多语言都是这样. 我们运行下面程序你将会看到 public class TestMathDecimal { publ ...

  7. java.math.BigDecimal

    package day14; import java.math.BigDecimal; /** * Created by admin on 2018/11/24. * 看程序写结果:结果和我们想的有一 ...

  8. java.math.BigDecimal类multiply的使用

    java.math.BigInteger.multiply(BigInteger val) 返回一个BigInteger,其值是 (this * val).声明 以下是java.math.BigInt ...

  9. Java的BigDecimal,对运算封装

    添加maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...

随机推荐

  1. Linux安转jdk

    1. 创建目录 > mkdir  /opt/java > cd /opt/java 2. 下载jdk压缩包到上述目录 jdk-8u162-linux-x64.tar.gz 3. 解压缩.建 ...

  2. Zabbix监控服务器异常IP登录

    保存下面的脚本到任意路径 名字.py 修改属组和权限: chown zabbix:zabbix * chmod 755 * 演示的路径为:/usr/local/zabbix/scripts/ # -* ...

  3. python--线程池(concurrent.futures)

    #!/usr/bin/env python # -*- coding:utf-8 -*- # author:love_cat # 为什么需要线程池 # 1.主线程中可以获取某一个线程的状态或者某一个任 ...

  4. Django和SQLAlchemy区别

    译者注:本文首先介绍了什么是ORM,然后从多个方面对Python语言下的两个ORM库Django和SQLAlchemy进行比较,为ORM的选型提供了较为全面的指导建议.以下是译文. ORM是什么? 在 ...

  5. c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区

    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数 ...

  6. 利用Excel导出sql语句

    在工作中遇到了需要用数据库的insert语句,本来是极其简单的事情,但是碰到了有n个(n很大)字段的表,写insert语句就是极其痛苦的事情了,即使只是复制粘贴也是很费力不讨好的一件事.正好手头有ex ...

  7. 七. 多线程编程6.isAlive()和join()的使用

    如前所述,通常你希望主线程最后结束.在前面的例子中,这点是通过在main()中调用sleep()来实现的,经过足够长时间的延迟以确保所有子线程都先于主线程结束.然而,这不是一个令人满意的解决方法,它也 ...

  8. iOS 设置系统音量和监听系统音量变化

    很简单的调用 首先在工程引入MediaPlayer.framework #import <MediaPlayer/MediaPlayer.h> 1. 获取系统音量 // 获取系统音量 MP ...

  9. 解魔方的机器人攻略15 – 安装 Eclipse

    由 动力老男孩 发表于 2009/12/27 17:40:49 在远古时代,程序员们通常用写字板来编写Java程序,然后用Javac.exe和Java.exe来编译和执行.对于NXT来说,对应的命令是 ...

  10. linux 之创建文件命令

    1.vi vi 1.txt 会直接创建并打开一个文件1.txt 2.touch touch的作用是更改一个文件或目录的时间.touch 2.txt 如果2.txt不存在,则创建空文件2.txt 3.e ...