zoukankan      html  css  js  c++  java
  • 解决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,保证对于无限小数有足够的范围来表示结果。

     
     
    问题扩展:
    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!计算条件若是错误的,计算结果怎么都会错啊
  • 相关阅读:
    ZOJ Problem Set–2417 Lowest Bit
    ZOJ Problem Set–1402 Magnificent Meatballs
    ZOJ Problem Set–1292 Integer Inquiry
    ZOJ Problem Set–1109 Language of FatMouse
    ZOJ Problem Set–1295 Reverse Text
    ZOJ Problem Set–1712 Skew Binary
    ZOJ Problem Set–1151 Word Reversal
    ZOJ Problem Set–1494 Climbing Worm
    ZOJ Problem Set–1251 Box of Bricks
    ZOJ Problem Set–1205 Martian Addition
  • 原文地址:https://www.cnblogs.com/svennee/p/4080912.html
Copyright © 2011-2022 走看看