Java中的数值类型选择

整数类型

有byte(1 byte),short(2 byte),int(4 byte),long(8 byte)等基本数据类型,取值的范围不一样。

1
2
3
4
byte x1 = 1;
short x2 = 2;
int x3 = 3;
long x4 = 4L;

涉及到有小数的数值

这种场景也是要分情况讨论的。

1.货币、金钱的计算

当涉及到人民币、美元的计算时,比如说人民币RMB,单位有元、角、分,我们可以参考腾讯微信的做法,把金钱都乘以100,转化为以分为整数的计算:

1
2
3
4
5
6
7
8
9
10
11
12
13
100.1 -> 1001
100.02 -> 100元零2

float m1 = 100.1f;
double d1 = 100.02d;

// 单位转换,小数值转整数
int money1ByCent = (int)(m1 * 100); // 10010,以分作为最小单位来计算,把小数给转化掉
int money2ByCent = (int)(d1 * 100); // 10002,同上

// 整数计算,结果转回小数值
int sub = money1ByCent - money2ByCent;
float f2 = (float) (sub * 1.0 / 100) // 转化为float存储

值得注意的是,在int计算完成后,转换回float的过程中,对于int -> float的计算,我们应该显式地乘以1.0(带入float类型)这样也会带来(checked exception)帮助我们进行显式转换;否则它仍然是进行int型的计算。有趣的是,我们在float->int的过程中,checked exception也帮助我们进行了显式转换,这一点是很重要的。

2.含小数的数字表示

如果小数只是用来存储和表示,那么还是可以使用float和double的。比如我们在javabean对象的属性里面,使用float和double来定义属性的数据类型,并为其生成getter和setter方法。

1
2
3
4
5
6
Class Book {
float price;
double weight;

// getter、setter省略
}

为什么这里又使用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
2
3
4
BigDecimal i1 = new BigDecimal("22.33321");
BigDecimal i2 = new BigDecimal("3.1242");
BigDecimal divide = i1.divide(i2, 2); // 保留精度,防止无限不循环
BigDecimal add = i1.add(i2);

对于乘法和除法,会出现小数点位数比较多的情况,除法更是有可能无限不循环,所以一般需要设置精度。当然,还有更加复杂的操作,可以去细看API文档。

结论

如果我们用不到小数,就使用整数类型。

如果需要使用小数进行计算,那么有2种方案:

  1. 金额类小数,转换为int计算,再转换为小数返回
  2. 其他小数,使用BigDecimal类进行计算

如果我们仅仅使用小数进行表示,可以使用float、double来表示属性,进行getter、setter方法。

最近的文章

好用的`java.util.Objects`类

在jdk1.7中,新增了一个工具类,就是java.util.Objects类。它有3个简单的封装方法,对于平常的使用来说挺有用的,分别是:hashCode、equals、toString这3个方法。 1、hashcode生成1234567891011121314151617181920// 1. O …

java.util.Objects 继续阅读
更早的文章

java项目中的classpath到底是什么

在java项目中,你一定碰到过classpath,通常情况下,我们是用它来指定配置/资源文件的路径。在刚开始学习的时候,自己也糊里糊涂,但是现在,是时候弄清楚它到底是指什么了。 顾名思义,classpath就是class的path,也就是类文件(*.class的路径)。一谈到文件的路径,我们就很有必 …

classpath 继续阅读