浮点数精度问题 —— BigDecimal

BigDecimal代替浮点数

1 介绍

BigDecimal提供了多个构造函数,和浮点数有关的有:

  • BigDecimal(double val) Translates a double into a BigDecimal.
  • BigDecimal(String val) Translates the String representation of a BigDecimal into a BigDecimal.

用double参数来创建对象得到不精确的值,只有通过String来创建对象才是最准确的。

2 例子

BigDecimal data1=new BigDecimal(0.05);
System.out.println(data1.toString());

得到结果:0.05000000000000000277555756156289135105907917022705078125

BigDecimal data2=new BigDecimal("0.05");
System.out.println(data2.toString());

得到结果:0.05

3 浮点数精度问题

  • 问题原因:浮点数在内存中是近似存储
  • 避免问题的办法:
    方法1:不用浮点数,用整数代替,例如进行资金运算时,按单位为分的整数进行运算;
    方法2:使用BigDecimal代替浮点数

4 BigDecimal.valueOf(double val)创建对象

public static BigDecimal valueOf(double val)
{ 
   return new BigDecimal(Double.toString(val));
 }

总结:BigDecimal的加减乘除其实最终都返回的是一个新的BigDecimal对象

5 例子

在这里插入图片描述
在这里插入图片描述


版权声明:本文为teacoffeetea原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。