关于 BigDecimal处理floatdouble数据

Posted cailijia52o

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 BigDecimal处理floatdouble数据相关的知识,希望对你有一定的参考价值。

                           Big Decimal

    在java中,对于float与double中的数据,总会因为精度问题而丢失数据的准确性,也就是说对于两者所处理的得到的值是无限接近于那个数,而并非一个精确数字,而对于电商中所涉及到的关于浮点型与double型数据,并且数据又得要求是准确性,又该如何处理呢?这里,必须用到Big Decimal!

一、先看代码:

(一)

@Test
public void test1(){
        System.out.print(0.05+0.01);
        System.out.print(1.0-0.42);      
        System.out.print(4.015*100);
        System.out.print(123.3/100);
}

结果:
技术分享图片
(二)

@Test
public void test2(){
       BigDecimal b1=new BigDecimal(0.05);
       BigDecimal b2=new BigDecimal(0.01);
       System.out.println(b1.add(b2));    

}

结果:
技术分享图片

(三)

@Test
public void test2(){
       BigDecimal b1=new BigDecimal(“0.05”);
       BigDecimal b2=new BigDecimal("0.01");
       System.out.println(b1.add(b2));    

}

结果:
技术分享图片

总结:

floatdouble只能用在科学计算和工程计算

如果是商业计算,必须用big Decimal

所以说在使用big Decimal时,必须使用它的string构造器,否则会出现严重精度丢失问题

当然,查看BigDecimal的源代码,从中也说明必须使用它的String构造器:

 

  * When a {@code double} must be used as a source for a
     * {@code BigDecimal}, note that this constructor provides an
     * exact conversion; it does not give the same result as
     * converting the {@code double} to a {@code String} using the
     * {@link Double#toString(double)} method and then using the
     * {@link #BigDecimal(String)} constructor.  To get that result,
     * use the {@code static} {@link #valueOf(double)} method.
     * </ol>
     *
     * @param val {@code double} value to be converted to
     *        {@code BigDecimal}.
     * @throws NumberFormatException if {@code val} is infinite or NaN.
     */
    public BigDecimal(double val) {
//一下省略
}

 

 

 

 

 

 

 









以上是关于关于 BigDecimal处理floatdouble数据的主要内容,如果未能解决你的问题,请参考以下文章

关于Bigdecimal的问题

关于BigDecimal 的计算

关于BigDecimal小记

关于 BigDecimal 的小数位的入舍去操作

关于Jackson默认丢失Bigdecimal精度问题分析

BigDecimal保留小数处理