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中为什么有两个常量来表示最小值的更多相关文章

  1. 0024 Java学习笔记-面向对象-包装类、对象的比较、String常量池问题

    包装类 基本类型-->包装类 byte-->Byte short-->Short int-->Integer long-->Long char-->Characte ...

  2. C语言中的数据转换和定义常量

    一.数据转换 1.数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型:在 C 语言中也可以对数据类型进行强制转换: 2.自动转换规则: a)浮点数 ...

  3. 处理Selection对象和Range对象——Word VBA中重要的两个对象

    处理Selection对象和Range对象——Word VBA中重要的两个对象 Word 开发人员参考Selection 对象代表窗口或窗格中的当前所选内容.所选内容代表文档中选定(或突出显示)的区域 ...

  4. 两种常量类型-readonly和const

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...

  5. Java中四舍五入保留两位小数

    Java中四舍五入保留两位小数 方法一 四舍五入 double f = 3.15; long res = Math.round(f); #结果 res = 3 保留两位小数 double f = 3. ...

  6. Android中Fragment的两种创建方式

    fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...

  7. 【跟着子迟品 underscore】JavaScript 中如何判断两个元素是否 "相同"

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

  8. [.net 面向对象编程基础] (5) 基础中的基础——变量和常量

    [.net面向对象编程基础]  (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...

  9. java 中 return 的两种常见的用法

    一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String priv ...

随机推荐

  1. SQL的top 100 percent用法

    sql="select top 30 * from data where title='"&title1&"' order by id desc" ...

  2. SQL Server中的事务日志管理的阶梯,级别1:事务日志概述

    SQL Server中的事务日志管理的阶梯,级别1:事务日志概述 翻译:刘琼滨 谢雪妮 许雅莉 赖慧芳 级别1:事务日志概述 事务日志是一个文件,其中SQL服务器存储了所有与日志文件关联的数据库执行的 ...

  3. 初探ABP--记一些常见的开发问题

    1.Update-Database : 无法将“Update-Database”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. ...

  4. 使用JavaScript给对象修改注册监听器

    我们在开发一些大型前端项目时,会遇到这样一种情况,某个变量上有个字段.我们想知道是哪一段程序修改了这个变量上的字段.比如全局变量window上我们自定义了一个新字段_name,我们想知道到底有哪些程序 ...

  5. docker使用阿里云镜像加速器(属于自己的专属加速器)

    https://cr.console.aliyun.com/cn-shanghai/mirrors

  6. nginx可用来干什么?

    1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片)通过HTTP协议展现给客户端. 配置: server { listen80; # 端口号 lo ...

  7. error: version in "./docker-compose.yml" is unsupported

    #sudo rm /usr/bin/docker-compose #curl -L https://github.com/docker/compose/releases/download/1.20.0 ...

  8. JAVA用freemarker生成复杂Excel。(freemarker)

    在生成Excel的时候,大多时候都是使用poi,jxl等进行的,但是对于复杂的Excel来说,这个工作量是非常的大的,而且,对于我这么懒的人来说,这是相当痛苦的一件事情,所以,我不得不找找有没有简单一 ...

  9. Angular JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory)

    方法一和方法二参考:https://www.cnblogs.com/liugang-vip/p/6857595.html 方法一:my-project/node_modules/.bin 下增大内存( ...

  10. dll加载遇到的问题

    dll加载有两种形式,分别是隐式加载和显式加载. 隐式加载在编译的时候就将dll文件编译到可执行文件中去,程序发布的时候可以不用讲dll带着.缺点是,这样编译出来后,程序会很大. 显式加载是指在程序运 ...