数值计算中,浮点类型给我们挖的坑

数值类型的计算,是实际的开发代码过程中,很常用,很简单。
这并不表示没有坑等着我们,谁让我们程序员不是在写Bug,就是在写Bug的过程中呢?

1 基本概念

浮点类型,用于表示有小数部分的数值。
在Java中有两种浮点类型:

类型存储大小取值范围
float4kb大约 ± 3.4.02 823 47E+38F(有效位数为6-7位)
double8kb大约 ±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类。

作者简介

一个真的有思想,不穿格子衬衫的程序员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值