数值类型的计算,是实际的开发代码过程中,很常用,很简单。
这并不表示没有坑等着我们,谁让我们程序员不是在写Bug,就是在写Bug的过程中呢?
1 基本概念
浮点类型,用于表示有小数部分的数值。
在Java中有两种浮点类型:
类型 | 存储大小 | 取值范围 |
---|---|---|
float | 4kb | 大约 ± 3.4.02 823 47E+38F(有效位数为6-7位) |
double | 8kb | 大约 ±1.79.97 693 134 862 315 70E+308(有效位数为15位) |
所有浮点数值计算都遵循IEEE 745规范。
三种特殊类型的浮点数值:
- 正无穷大
- 负无穷大
- NaN(不是一个数字)
一个整数除以0的结果为正无穷大,计算 0/0 或者负数的平方根结果为NaN。
2 代码示例
浮点数相减
// 两个浮点数相减
double subtrahend = 2.0;
double minuend = 1.1;
double remainder = subtrahend - minuend;
System.out.println("两个浮点数相减,2.0减去1.1的结果为:" + remainder);
说明:注意实际输出结果不是0.9,而是:0.8999999999999999
浮点数循环
// 在循环语句中,判断两个浮点数是否相等
for (double i = 0; i != 10 ; i += 0.1) {
System.out.println("循环语句中的浮点数等式比较:" + i);
}
说明:不要在循环语句中,使用浮点数值类型做判断,由于精度丢失,会造成死循环。
大数值计算概率
// 使用BigDecimal数值类型,计算在490个数字中,抽取60个数字的概率
int pickNumber = 60;
int sumTotal = 490;
BigDecimal probability = BigDecimal.valueOf(1);
for (int i = 1; i <= pickNumber; i++){
probability = probability.multiply(BigDecimal.valueOf(sumTotal - i + 1)).divide(BigDecimal.valueOf(i));
}
System.out.println(probability);
说明:输出的结果为 716395843461995557415116222540092933411717612789263493493351013459481104668848
概率值表示为 1 / 716395843461995557415116222540092933411717612789263493493351013459481104668848
大数值类型BigDecimal采用实现的计算方法(add,subtract,multiply,divide)
3 总结
- 1 浮点数值在计算的过程中会丢失精度,不适用于无法接受舍入误差的金融计算中。
- 2 这种摄入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数 1/10。这就好像十进制无法精确地表示分数 1/3 一样。
- 3 如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类。
作者简介
一个真的有思想,不穿格子衬衫的程序员。