博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础扫盲系列(二)—— Java中BigDecimal和浮点类型
阅读量:6824 次
发布时间:2019-06-26

本文共 1652 字,大约阅读时间需要 5 分钟。

一直以来我几乎未使用过BigDecimal类型,只有在DB中涉及到金额字段时听说要用Decimal类型,但是今天再项目代码中看到使用BigDecimal表示贷款金额。

本篇文章不是介绍BigDecimal原理,只是说明BigDecimal和浮点的区别以及其应用场景。

借用《Effactive Java》这本书中的话:

float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。

下面来看几个例子:

double d1 = 11540;double d2 = 0.35;System.out.println(d1 * d2);

执行结果:

4038.9999999999995

但是实际结果应该是:

4039.00

这类就出现上述Effective Java中提到的double用于科学计算,提供的是精确的快速近似计算,导致失去了精准结果。

// 科学计数法double d3 = 0.0000000000000000111;System.out.println(d3);

输出结果:

1.11E-17

这也是上述提到的double用于科学计算领域,使用了科学计数法。

但是在实际项目中,特别对于金融领域,对金额十分敏感和精确的前提下不可能使用double或者float的浮点类型:

  • 用于科学计算领域使用了科学计数法
  • 用于大型数值近似计算,结果近似准确

基于以上,需要新的类型实现精准计算,Java提供BigDecimal类型:

Immutable, arbitrary-precision signed decimal numbers. A

  • {@code BigDecimal} consists of an arbitrary precision integer
  • unscaled value and a 32-bit integer scale

由Java docs中可以看出,BigDecimal是不可变的任意进度的十进制数。

BigDecimal位于java.math包下,正如其包名和类名,该类也提供了很多算术运算:加减乘除。

这里就不做详细介绍,具体可以查阅api文档。下面可一些例子:

BigDecimal bigDecimal1 = new BigDecimal("11540");BigDecimal bigDecimal2 = new BigDecimal("0.35");System.out.println(bigDecimal1.multiply(bigDecimal2));

输出结果:

4039.00

这里就是精准计算,所以项目应用中金额一般都用BigDecimal类型。

下面再介绍一些关于BigDecimal中使用到的一些坑和使用原则:

BigDecimal bigDecimal1 = new BigDecimal(20.11345);BigDecimal bigDecimal2 = new BigDecimal("20.11345");System.out.println(bigDecimal1);System.out.println(bigDecimal2);

输出结果:

20.1134500000000002728484105318784713745117187520.11345

在使用BigDecimal的double参数构造函数时,一定要注意看业务场景:是需要double近似还是精确。如果需要精确的场景,在使用前一定要将double转换成String,然后再转换成BigDecimal。否则将都是近似表示。

转载于:https://www.cnblogs.com/lxyit/p/9366927.html

你可能感兴趣的文章
Python进阶 学习笔记(一)
查看>>
电梯测试点有哪些?
查看>>
如何点击UIWebView上html链接不弹出复制粘贴
查看>>
HDU 2709 Sumsets(递推)
查看>>
spring属性注入DI
查看>>
ofo4.0时代展望移动物联网应用 让智慧生活“随意念而动”
查看>>
阿里巴巴到底是一家什么公司?
查看>>
理想生活没那么难
查看>>
阿里NASA的深意:巨头正名还是其他?
查看>>
程序员都用什么牌子电脑编程?国产电脑很强大啊!
查看>>
禁“大声说中文”杜克大学教师邮件涉歧视遭解职
查看>>
2018年四川全社会用电量2459亿千瓦时 增长11.5%
查看>>
浙江查获5000余张假火车票 系跨省家族式作案网上交易
查看>>
女子两年间“嫁”了七回 涉嫌诈骗罪被提起公诉
查看>>
林郑月娥:香港有足够能力将经济挑战转为发展机遇
查看>>
成为Master,谷歌人工智能系统新增对Windows的支持
查看>>
AR、VR及MR在这几年越来越火红,之间又有哪些区别
查看>>
大数据正在改变汽车行业的5种方式
查看>>
40行Python代码,实现卷积特征可视化
查看>>
小米研发类Kindle电子阅读器
查看>>