double取值范围 java_Java中float/double取值范围与精度

Java浮点数

浮点数结构

要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法,比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数。而Java中浮点数采用的是IEEE 754标准。

IEEE 754

这里就不细说什么是IEEE 754了,就直接讲具体内容,有兴趣的可以自己百度。

float

符号位(S):1bit

指数位(E):8bit

尾数位(M):23bit

一个float4字节32位,分为三部分:符号位,指数位,尾数位。

(1).符号位(S):最高位(31位)为符号位,表示整个浮点数的正负,0为正,1为负;

(2).指数位(E):23-30位共8位为指数位,这里指数的底数规定为2(取值范围:0~255)。这一部分的最终结果格式为:2E−127,即范围-127~128。另外,标准中,还规定了,当指数位8位全0或全1的时候,浮点数为非正规形式(这个时候尾数不一样了),所以指数位真正范围为:-126~127。

(3).尾数位(M):0-22位共23位为尾数位,表示小数部分的尾数,即形式为1.M或0.M,至于什么时候是1,什么时候是0,则由指数和尾数共同决定。 小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式,其他情况是特殊值。 最终float的值 = (−1)S∗(2E−127)∗(1.M)。具体形式如下:

符号

指数

部分

指数部分-127

尾数部分

小数部分的

最高有效位

形式

1

255

128

非0

没有

NaN

1

255

128

0

没有

负无穷

1

1~254

-126~127

任意

1

正规形式(负数)

1

0

-127

非0

0

非正规形式(负数)

1

0

-127

0

没有

负0

0

0

-127

0

没有

正0

0

0

-127

非0

0

非正规形式(正数)

0

1~254

-126~127

任意

1

正规形式(正数)

0

255

128

0

没有

正无穷

0

255

128

非0

没有

NaN

double

符号位(S):1bit

指数位(E):11bit

尾数位(M):52bit

double这里就类似float,只是double的长度更大,所以范围就更大,但规则是一样的。double的值 = (−1)S∗(2E−1023)∗(1.M)。

取值范围

根据表1可知,float的取值范围:

负无穷 —— −2128 ~~~ −2−149 —— 0 —— 2−149 ~~2128 —— 正无穷

1). 上面的“——”表示中间不能取值,例如负无穷到−2128中间的值是取不到的(事实上128也是取不到的,只是接近近似值),但这并不是意味着,“~”任意值都能取到的,要注意,浮点数都是有精度的,并不能表示绝对值任意小的值。另外,Java中无穷大表示为:

Float.POSITIVE_INFINITY或Double.POSITIVE_INFINITY//表示正无穷大

Float.NEGATIVE_INFINITY或Double.NEGATIVE_INFINITY//负无穷大

//他们打印的结果:+/-Infinity

float f1 = (float)Math.pow(2,128);//指数>=128的,打印结果:Infinity

//上面要加(float)强制转换,否则编译提示出错,详细可参考前一节:Java变量数据类型

float f2 = (float)Math.pow(2,127);//1.7014118E38

System.out.println(Float.MAX_VALUE);//3.4028235E38

//其他测试,读者可自行测试

1

2

3

4

5

6

7

8

2). -149的得来:看上面理论应该是150(指数全0,则指数值 = 0 -127,这个时候尾数取最小,2−23,则-127-23 = -150),可不知道为什么是149,我查到的资料是说,全0,全1为特殊值,不作为范围内的值,上面的float的最大最小值Float.MAX_VALUE都是接近2128)。故值 = (−1)S∗(2−126)∗(2−23) = +/-2−149

float f3 = (float) Math.pow(2,-149)//1.4E-45,小于-149,结果则为0.0

Float.MIN_VALUE //1.4E-45

1

2

double的取值同float:

负无穷 —— −21024 ~~~ −2−1074 —— 0 —— 2−1074 ~~21024 —— 正无穷

1074 =| (-1022) - (52)|

另外,注意表格中,还有NaN,即表示非数值,例如:

System.out.println(0.0/0.0);//打印结果:NaN。注意不能是 0/0

//NaN表示计算错误,具体出现情况,可以参考表中

//Float.NaN或 Double.NaN 也能直接表示NaN,NaN与其他数计算结果均为NaN,除了

Math.pow(Float.NaN,0);//结果为1.0

//另外NaN == NaN; false

1

2

3

4

5

浮点数精度

精度是由尾数决定的,为什么?由浮点数的值计算公式可知:当指数的最终值为负,虽然这个时候浮点数的值能表示更小,但这个时候仅仅能表示0~1(或-1~0)这个数段的小数,没有实际意义。所以精度主要是看尾数的值。

float

float的尾数:23位,其范围为:0~223,而223=8388608=106.92,所以float的精度为6~7位,能保证6位为绝对精确,7位一般也是正确的,8位就不一定了(但不是说8位就绝对不对了),注意这里的6~7位是有效小数位(大的数你先需要转换成小数的指数形式,例如:8317637.5,其有效小数位:8.3176375E6,七位),而有效位(从第一个不为0的开始数)是7~8位,是包括整数位的,像8317637.5,你不转换,则要从有效位的角度来看,有8位有效位。

System.out.println((float)Math.pow(10,6.92));//注意加float强制转换

//打印结果8317637.5,float只保证7~8位有效位,其余位数舍入

1

2

不理解的话,可以再这样想:23位,二进制0101……0101,尾数表示小数位,最小为0000……0001(22个0,最后一个1),即2−23=1.1920929E-7 ,这是float的最小单元(大概是0.0000001192大小,你想表示比这更小的,比如0.00000001,不可能啊),这是一个7位小数位小数,最小就是这么小,比这个更小的,计算机就无能为力了,比这个更大的,每次通过加这么一个最小单元,直到相等或接近(两个相差一个最小单元的数,它们之间的数也是不能表示的,所以有的7位也是不能精确的,因为最小不是0.0000001,而是比这个稍大)。

double

计算方式同float,double的尾数:52位,2−52=2.220446049250313E-16,最小是16位,但最小不是1.0E-16,所以精度是15~16,能保证15,一般16位。

更多关于Java浮点数的,可以参考这里:基础野:细说浮点数(肥子John)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源点云数据处理 开源_大数据开源安全

开源点云数据处理 开源在安全性方面从未有(恕我直言)已经足够了开源解决方案和布鲁斯已经撰写了有关这几个 时间在过去 ,而且也没有必要再次改写参数。 现在,随着市场上“ NoSQL”和“大数据”开源趋势的发展,安全终于…

为您的Web应用程序启用两因素身份验证

支持两因素身份验证(2FA)几乎总是一个好主意,尤其是对于后台系统。 2FA有许多不同的形式,其中一些包括SMS,TOTP甚至是硬件令牌 。 启用它们需要类似的流程: 用户转到其个人资料页面(如果要在注…

redis java序列化_java处理redis的几种序列化策略

简单记录一下java处理redis的几种序列化策略,这里使用的环境是springboot 2.0.4springboot中提供了StringRedisTemplate和RedisTemplate两种序列化类,它们都只能读自己存的数据,即数据互不相通。主要区别如下:1、采用的序列化策略…

java 访问内部类的属性_java中的内部类详细总结

内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)显然,此处不能单方…

迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中

服务器发送的事件 (或简称为SSE )是非常有用的协议,它允许服务器通过HTTP将数据推送到客户端。 这是我们的网络浏览器支持的年龄,但令人惊讶的是, JAX-RS规范在很长一段时间内都忽略了这一点。 尽管Jersey提供了适用于…

java 面向对象继承的思想_Java面向对象思想

Java类的定义:成员变量会默认初始化,局部变量不会默认初始化。如何在内存中区分类和对象:♦类是静态的概念,代码区♦对象是new出来的,位于堆内存,类的每一个成员变量在不同的对象中都有不同的值(除了静态变…

java 垃圾回收手动回收_Java垃圾回收(4)

java 垃圾回收手动回收G1:垃圾优先 G1收集器是热点JVM中要实现的最新收集器。 自Java 7 Update 4以来,它一直是受支持的收集器。OracleGC团队也公开表示,他们对低暂停GC的希望是完全实现的G1。 这篇文章来自我之前的垃圾收集博客文章&#xf…

使用正确的垃圾收集器将Java内存使用量降至最低

大小对于软件至关重要。 很明显,与大型整体方法相比,在微服务体系结构中使用小型组件具有更多优势。 最新的Java版本的Jigsaw可帮助分解旧应用程序或从头开始构建新的云原生应用程序。 这种方法减少了磁盘空间,构建时间和启动时间。 但是&am…

java 鼠标画多个圆形_点击鼠标不同的建(左、中、右)画一个不同颜色的圆

[java]代码库import java.awt.Color;import java.awt.Graphics;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JFrame;public class T1 extends JFrame{int x;int y;Color c;public T1(){this.setSize(600,400);this.setDefaultCl…

jslint4java_JSLint检测javascript的错误提示

“Missing semicolon.” : “缺少分号.”,“Use the function form of \”use strict\”.” : “使用标准化定义function.”,“Unexpected space after ‘-’.” : “在’-后面不应出现空格.”,“Expected a JSON value.” : “请传入一个json的值.”,“Mixed spaces and tabs.…

jar运行 osgi保存_自动化的OSGi测试运行程序

jar运行 osgi保存在我的团队成员中,我以忘记维护(JUnit)测试套件而闻名。 我只是无法完成手动添加测试套件这一额外步骤。 幸运的是,有连续的集成服务器可以按命名模式收集测试。 如果我介绍的一项孤立测试失败了,那么…

mysql 去掉默认约束_06. 默认约束-创建、添加和删除

# 数据库的基本操作创建 删除 数据库、创建 删除表修改 表名 数据类型 字段名 添加字段删除 字段 调整字段位置 更换存储引擎 删除外键删除 数据表 包括被关联父表# 数据完整性六项约束主键约束(PRIMARY KEY)自增约束(AUTO_INCREMENT PRIMARY KEY)唯一约束(UNIQUE)默认约束(DEF…

通过粘性仙人掌基元进行延迟加载和缓存

您显然知道什么是延迟加载 ,对吗? 而且您无疑知道缓存 。 据我所知,Java中没有一种优雅的方法来实现它们中的任何一个。 这是我在Cactoos原语的帮助下为自己找到的。 Matteo Garrone的《 Reality(2012)》 假设我们需…

mysql与sim900a_sim900a的应用,基于SIM900A-GPRS模块的远程文件传输实例

SIM900A是一个比较实用的GPRS模块,进行简单的配置就可以进行用于数据传输,配置使用AT指令进行交互,用GPRS远程传输数据时,有两种方式,一种是正常的模式,没法送一次要发送0x1a来开启数据发送,另一…

java语言编程基础_java语言编程基础

java语言基本要素高级语言如c、c#、java等都有一些共同性的东西:关键字、标识符、运算符、注释、数据类型、常量和变量、语句、函数、数组。高级语言在这些要素上大同小异。Java关键字:一些有特定含义,有专门用途的字符串(keyword)。Java中关…

junit mockito_JUnit和Mockito合作

junit mockito这次,我想对测试框架Mockito进行概述。 毫无疑问,这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。 使用Mockito…

debian10树莓派4安装mysql_树莓派4上如何安装 Raspbian Buster

随着 Raspberry Pi 4 主板的问世,了解如何使用Raspbian Buster设置您的操作系统。你的新Pi 4到了邮箱,你已经设置了办公桌,您已准备好安装操作系统。对于初学者来说,Raspbian为Pi制造商提供了出色的桌面体验。最重要的是&#xff…

借助财务客户评估解决方案在云中构建AppDev

现代JBoss BRMS时代最古老的业务逻辑演示是2012年6月发布的“ 客户评估”示例 。 那时,JBoss BRMS包含规则,事件和流程。 该项目提供了一个完整安装和配置的环境,用于展示该项目和所有可用的BPM组件。 它包括一个带有单元测试的JBoss Develo…

jvm 性能_JVM性能魔术

jvm 性能HotSpot是我们众所周知和喜爱的JVM,是Java和Scala汁流淌的大脑。 多年来,许多工程师对其进行了改进和调整,并且每次迭代时,其代码执行的速度和效率都接近于本机编译代码。 JIT(“及时”)编译器是…

java高级编程期末考试题_java高级编程考题

Java高级课程测试1在进行swing开发时,经常用的布局管理器有那几种?(5)2Gui组件,容器,框架,到底有怎样的关系,请举例说明?(5)3在进行swing开发中会用到事件处理,那事件处理的三个主要…