关于BigDecimal

我们都知道,在java中浮点数由double与float表示,他们在计算的时候会出现精度问题,比如

我们期望得到的结果是2.03,结果却得到了不精确的数字,这个涉及到计算机原理,不详细展开。因为不精确的关系,当涉及到钱的计算时,我们便不能使用double或者float进行计算,这时我们需要使用BigDecimal。

BigDecimal的构造

但是BigDecimal一定是精确的吗?

我们使用BigDecimal的double类型的构造参数生成对象在进行相加,发现得到的结果也并不精确,api中给出的解决方案是使用string类型的构造函数。所以这里我们需要注意的是直接使用new 的方式构建对象的时候需要使用string类型的构造函数才能保证精确。更好一点的做法是使用静态方法valueOf进行初始化。

可以看到他最后也是使用了string类型的构造函数的构造函数进行了初始化。这时再来看计算结果,发现结果是精确的。

使用valueof方法还有一个好处

BigDecimal的比较

BigDecimal重写了equals方法方便我们进行大小的比较,然而equals不仅会比较大小,还会进行精度的比较,当我们使用string类型额构造函数进行构造时,添加了多余的0,发现c与d并不相等。而compareTo方法则只会进行大小的比较,与精度无关。当使用valueof方法进行构造时,他会帮我们去掉多余的精度,这样使用equals方法进行比较时也不会发生错误。但是在比较大小的时候还是推荐使用compareTo方法进行比较。

几个常量

BigDecimal预置了3个常用的数字供我们使用,分别是0,1,10.对应到类分别为BigDecimal.ZERO,BigDecimal.ONE,BigDecimal.TEN,他们的精度都是0。若我们使用到以上几个数字,尽量使用类预置的常量。

BigDecimal的toString

BigDecimal提供了3个toString方法,自己喜欢使用toPlanString,即不使用指数的形式进行输出,toString则是当位数超过一定数量使用指数形式,toEngineeringString则是使用工程模式进行输出。

BigDecimal的其他方法基本就是常用的加减乘除等操作了,这里就不介绍了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.最重要是概念: The only thing that kept me going was that I th...
    231李国芳阅读 1,605评论 4 2
  • 日期:2017年6月29日 天气:晴 心情:舒畅 今天是特训营第七天,早上的签到我们6班像是被下了魔咒一样,只能说...
    clairesh阅读 1,157评论 0 0
  • Wynns阅读 1,475评论 0 0
  • 1 旷日持久的课表任务终于结束,统计了一周的时间开销记录,花费了20个小时,加上蓉蓉姐的7小时,这样子算下来,这一...
    拍谢少女阅读 3,624评论 0 50
  • 你伪装成万兽之王 露出你的虎牙光亮耀眼 引诱我探险 你的爱沉溺在森林的幽深中 迷茫得四处飘洒 你的爱沉溺在情人们的...
    雨格格君阅读 3,561评论 0 1