博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数值计算中,浮点类型给我们挖的坑
阅读量:5241 次
发布时间:2019-06-14

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

数值类型的计算,是实际的开发代码过程中,很常用,很简单。

这并不表示没有坑等着我们,谁让我们程序员不是在写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类。

作者简介

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

1617540-20190715114319611-1612297417.jpg

转载于:https://www.cnblogs.com/swdcx/p/11187818.html

你可能感兴趣的文章
12.4站立会议
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
客户端访问浏览器的流程
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
编程面试的10大算法概念汇总
查看>>
Vue
查看>>
python-三级菜单和购物车程序
查看>>
条件断点 符号断点
查看>>
VMware12 + Ubuntu16.04 虚拟磁盘扩容
查看>>
水平垂直居中
查看>>
MySQL简介
查看>>
设计模式之桥接模式(Bridge)
查看>>
jquery的$(document).ready()和onload的加载顺序
查看>>
Python Web框架Django (五)
查看>>
.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串------(转)...
查看>>
【codevs1033】 蚯蚓的游戏问题
查看>>
【程序执行原理】
查看>>
python的多行注释
查看>>