整数类型
有byte(1 byte),short(2 byte),int(4 byte),long(8 byte)等基本数据类型,取值的范围不一样。
1 | byte x1 = 1; |
涉及到有小数的数值
这种场景也是要分情况讨论的。
1.货币、金钱的计算
当涉及到人民币、美元的计算时,比如说人民币RMB,单位有元、角、分,我们可以参考腾讯微信的做法,把金钱都乘以100,转化为以分为整数的计算:
1 | 100.1 -> 100元1角 |
值得注意的是,在int计算完成后,转换回float的过程中,对于int -> float的计算,我们应该显式地乘以1.0(带入float类型)这样也会带来(checked exception)帮助我们进行显式转换;否则它仍然是进行int型的计算。有趣的是,我们在float->int的过程中,checked exception也帮助我们进行了显式转换,这一点是很重要的。
2.含小数的数字表示
如果小数只是用来存储和表示,那么还是可以使用float和double的。比如我们在javabean对象的属性里面,使用float和double来定义属性的数据类型,并为其生成getter和setter方法。
1 | Class Book { |
为什么这里又使用float和double来表示呢?因为对于javabean的属性而言,我们只是用float和double来保存一些数值,并不会用它们直接进行计算。所以不会造成精度的损失。相比较于BigDecimal,这样更加节约空间。
这里,简答提一下float和double。2者都有符号位,可以表示正负。float:(4byte,e+-38);double:(8byte,e+-308)。我们给出结论:如果要用到float和double,那么float的范围足够我们使用了。
3.科学计算
当我们一定要进行小数的计算时,不是货币、金钱那种简单的转化就能实现的。我们应该使用java.math.BigDecimal
这个数据类型。它可以精确进行计算,虽然计算有点麻烦,速度有点慢。
1 | BigDecimal i1 = new BigDecimal("22.33321"); |
对于乘法和除法,会出现小数点位数比较多的情况,除法更是有可能无限不循环,所以一般需要设置精度。当然,还有更加复杂的操作,可以去细看API文档。
结论
如果我们用不到小数,就使用整数类型。
如果需要使用小数进行计算,那么有2种方案:
- 金额类小数,转换为int计算,再转换为小数返回
- 其他小数,使用BigDecimal类进行计算
如果我们仅仅使用小数进行表示,可以使用float、double来表示属性,进行getter、setter方法。