在很大的数互相计算时,如何保持小数点后16位的计算精度?例如:
1000000000.1234567890123456+0.1234567890123456
计算结果要精确到小数点后16位。

解决方案 »

  1.   

    public static void main(String[] args) throws Exception{
    BigDecimal bd=new BigDecimal(1000000000.1234567890123456);
    bd.add(new BigDecimal(0.1234567890123456));
    System.out.println(bd);
    DecimalFormat format=new java.text.DecimalFormat();
    format.setMinimumFractionDigits(16);
    format.setMinimumIntegerDigits(10);
    format.setParseBigDecimal(true);
    format.setGroupingUsed(false);
    System.out.println(format.format(bd));
    }
      

  2.   

    1#的方法没问题,但是它的结果错了。bd是对象,那样做不会有加法效果的。应该重新赋一次值。
    import java.math.*;//1000000000.1234567890123456+0.1234567890123456 public class Digits {
    public static void main(String args[]){
    double a = 1000000000.1234567890123456 + 0.1234567890123456;

    MathContext mc = new MathContext(26);//前提是知道小数点之前有多少位
    BigDecimal sum = new BigDecimal(a, mc);

    System.out.println(sum);
    }
    }
      

  3.   

    楼上两位都错了.Java中要进行精确解的计算,前提有2点
    1.精确的构造出BigDecimal对象
    2.使用BigDecimal对象进行计算1楼的错误在于构造BigDecimal时构造函数选择的错误
    BigDecimal bd=new BigDecimal(1000000000.1234567890123456);
    应该使用
    BigDecimal bd=new BigDecimal("1000000000.1234567890123456");
    为什么后面我们会说到2楼的错误在于
    double a = 1000000000.1234567890123456 + 0.1234567890123456;
    这样计算出来的结果本身已经不是一个精确解了
    我们可以进行一个实验
    System.out.println(2.00 - 1.10);
    结果并不是0.1
    为什么呢
    因为Java中使用double,float进行计算时,有一个二进制的转化过程,但是十进制的0,1在转为二进制数时,结果是一个循环小数,根本无法被二进制精确表示,所以出现了2.00-1.10!=0.1的情况所以我们在java进行精确计算时,一定要使用BigDecimal类lz的计算可以这样满足
            BigDecimal x = new BigDecimal("1000000000.1234567890123456");
            BigDecimal y = new BigDecimal("0.1234567890123456");
            BigDecimal z = x.add(y).setScale(16, RoundingMode.HALF_UP);
    要注意的是构造BidDecimal,一定要用String去构造,千万不要用int,float,double去构造,哪怕new BigDecimal(0)也不可以,一定要用new BigDecimal("0")
    涉及到精度问题. 
      

  4.   

    计算时保持 16 位小数,就是要在整个计算过程中对每个结果保持 16 位小数的精度,所以 double 万万不可取。1 楼也是无意识的使用了 double。
      

  5.   


    哈哈,惭愧,我确实不知道BigDecimal有这两种初始化的差异。学习了!
      

  6.   

    学习,受教。确实对BigDecimal了解不多。