包装类Float中为什么有两个常量来表示最小值
1)问:包装类Float中为什么有两个常量来表示最小值:MIN_VALUE和MIN_NORMAL
① MIN_VALUE:最小正非零值常量,是非规格化浮点数所能表示的最小值。值为 3.4E-45 的常量。
② MIN_NORMAL:最小正标准值常量,是规格化浮点数所能表示的最小值,即 2^-126。
可以看出,定义中“格式化”是MIN_VALUE和MIN_NORMAL ,不同的关键因素。
分析:
在计算机中浮点数是由符号,指数和尾数组成。
同一个数字可以有多种表达方式111.11可以表示为1.1111*10^2也可以表示为0.11111*10^3,计算机要进行计算处理就必须要有固定的表达方式,否则计算起来会很影响效率,因此需要规划范表示浮点数,规范化以后表示为±1.f×2E−127,f是尾数,E是指数,由于整数部分固定为1,所以可以省略。
以单精度为例,指数位为8位,尾数位为23位,由于整数部分1固定23位的尾数可以表示24位,所以可以得出结论:
一个int值从第一个1到最后一个1为止的位数超过24,则该值不能被float精确表示。
因为指数部分为了表示负数,所以采用偏移值的编码方式,将8位255一分为二,[ 1,127 ) 是负数,[ 127, 254 ] 是正数,0和255有特殊用途。所以最小的正规化表示为2^-126也就是MIN_NORMAL。
由于在指数运算中可能出现的浮点数对应的指数小于-126,导致无法进行规范化保存,如果按规范化去表示,可能导致一个非零值变为零值,为了解决这种问题,IEEE 标准中引入了非规范(Denormalized)浮点数。规定当浮点数的指数为允许的最小指数值,尾数不必是规范化的,这样可以保存更小的尾数,MIN_VALUE为能保存到的最小的非零值,就是MIN_NORMAL*2-23,也就是尾数1右移23位。
2)问:double a = 1.0-0.9的结果不精确等于0.1,为什么?
浮点数在计算机中进行加减运算时,需要经过零值检测、对阶操作、尾数求和、规格化操作等操作,精度可能丢失。
float和double只能用来做科学计算或者是工程计算。
NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
验证:
double a = 1.0-0.9;//0.09999999999999998
double b=1,c=1.0;
System.out.println(b==c);//true
double d=0.09999999999999998;//0.09999999999999998
double e=1/10;
System.out.println("e="+e);//0.0
//float f=0.09999999999999998;不兼容,失精度
float g=0.09999999999999998f;//0.1
System.out.println(new BigDecimal(0.1));//0.1000000000000000055511151231257827021181583404541015625
System.out.println(new BigDecimal("1").subtract(new BigDecimal("0.9")));//0.1
包装类Float中为什么有两个常量来表示最小值的更多相关文章
- 0024 Java学习笔记-面向对象-包装类、对象的比较、String常量池问题
包装类 基本类型-->包装类 byte-->Byte short-->Short int-->Integer long-->Long char-->Characte ...
- C语言中的数据转换和定义常量
一.数据转换 1.数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型:在 C 语言中也可以对数据类型进行强制转换: 2.自动转换规则: a)浮点数 ...
- 处理Selection对象和Range对象——Word VBA中重要的两个对象
处理Selection对象和Range对象——Word VBA中重要的两个对象 Word 开发人员参考Selection 对象代表窗口或窗格中的当前所选内容.所选内容代表文档中选定(或突出显示)的区域 ...
- 两种常量类型-readonly和const
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...
- Java中四舍五入保留两位小数
Java中四舍五入保留两位小数 方法一 四舍五入 double f = 3.15; long res = Math.round(f); #结果 res = 3 保留两位小数 double f = 3. ...
- Android中Fragment的两种创建方式
fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...
- 【跟着子迟品 underscore】JavaScript 中如何判断两个元素是否 "相同"
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- [.net 面向对象编程基础] (5) 基础中的基础——变量和常量
[.net面向对象编程基础] (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...
- java 中 return 的两种常见的用法
一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String priv ...
随机推荐
- 【HEVC帧间预测论文】P1.4 Motion Vectors Merging: Low Complexity Prediction Unit Decision
Motion Vectors Merging: Low Complexity Prediction Unit Decision Heuristic for the inter-Prediction o ...
- ubuntu服务器切换语言
如果在安装Ubuntu Server时选择了中文,在系统安装完毕后,默认是中文,在操作时经常会显示乱码,如果需要设置回英文,则修改/etc/default/locale,将 LANG="cn ...
- 1.入手树莓派之linux环境搭建
最近刚刚买了一款 树莓派3代B型 raspberrypi 板载蓝牙和WIFI 英国版本,没玩过,觉得很好奇,生怕记性不好哈,把自己玩的过程记录一下,以备不时之需: 需要材料: 1) 树莓派: 2)sd ...
- STL || HDU 1263 水果
map可以映射map…… 然后在map里面会自己排序 惊了 注意输出格式 回车的输出 #include <iostream> #include <cstdio> #includ ...
- 前端学习日记-vue cli3.0环境搭建
卸载老版本的 vue-cli : npm uninstall vue-cli -g 安装新版本的 : npm install -g @vue/cli --安装新版本cli 同时nodeJS 要更新至 ...
- 题解 洛谷P3622/BZOJ1151【[APIO2007]动物园】
这一道题,我也是搞了很久才搞懂的(也就两个多小时). 感谢Rayment大佬的题解! 我们进入正题. 对于一个笼子里的动物,我们可以选择撤走或不撤走,可以用0和1来表示,很容易就想到二进制,想到状压d ...
- 5.1 qbxt 一测 T2
求和[问题描述] 组合数 C(n,m)是从 n 个物品中取 m 个的方案数. C(n,m)=(n!)/(m!(n-m)!) 斐波那契数列 F 满足,F[0]=F[1]=1,n≥2 时 F[n]=F[n ...
- ssh服务介绍
基本介绍 ssh:安全的远程登陆 要有客户端与服务器端,客户端主动链接服务端,那么服务端地址是不能变的. socket:套接字 标识应用唯一的地址 tcp/udp port端口号 cat /etc/s ...
- 如何用纯 CSS 创作炫酷的同心矩形旋转动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/bMvbRp 可交互视频教 ...
- 常用mysql
搜索差价 select count(*) from gate_okex_cj; select * from (select count(*) as a_cj,coin from gate_okex_c ...