`

<转载>JAVA浮点数二进制详解

    博客分类:
  • java
 
阅读更多

作者: zengdongwu

转载地址: http://www.zengdongwu.com/article1.html

十进制科学记数法

98765 = 9.8765 * 104
              尾数        基数指数

二进制科学记数法

1)1010 1011 = 1010 1011. * 20

2)1010 1011 = 1010 101.1 * 21

3)1010 1011 = 1010 10.11 * 210

4)1010 1011 = 1010 1.011 * 211

4)……

5)1010 1011 = 1.010 1011 * 2111

                           尾数              基数指数

小数点二进制科学记数法

101.0 1011(2) = 1.010 1011 * 210(2) = 5.34375(10)

二进制小数转十进制方法:

22 + 20 + 2-2 + 2-4 + 2-5 = 5.34375

十进制小数转二进制方法:

1)5.34375整数位为5,转二进制为101;

2)小数位0.34375 * 2 = 0.6875,整数位为0,结果101.0;

3)继续0.6875 * 2 = 1.375,整数位为1,结果101.01;

4)去掉整数继续乘2,0.375 * 2 = 0.75,结果101.010;

5)循环到没有小数为止……;

6)最终结果:101.01011。

float(32bit)二进制存储结构

0 1000 0001 0101 0110 0000 0000 0000 000
符号位 指数(8bit) 尾数(23bit)

原理说明:

1)第1位为符号位,0为整数,1为负数;

2)第2-9位为指数位,共8位,不足8位前面补0,由于指数没有符号位,不能表示负数,只能通过将结果减127来得到负数,所以指数位存储的结果是原指数加127,即指数2存储后指数为 2+127 = 129(10) = 1000 0001(2);

3)第10-32位为尾数位,共23位,不足23位后面补0,尾数位包含隐藏的1.X,即1.010 1011只存储0101 011,然后后面补0,最终结果为0101 0110 0000 0000 0000 000。

float转十进制方法:

1)符号位0为正数;

2)指数转十进制,1000 0001为129,需要减127,所以指数为129-127=2;

3)尾数去掉后面的0,结果为0101 011;

4)尾数前面加1. 即:1.010 1011;

5)指数为2,小数点往后移2位,即:101.0 1011;

6)转十进制22 + 20 + 2-2 + 2-4 + 2-5 = 5.34375。

代码验证:

  float f = 5.34375f;
  System.out.println(Integer.toBinaryString(Float.floatToIntBits(f)));

采用double(64bit)二进制表示方式

0 0010 0000
001
0101 0110 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000
0000
符号位 指数(11bit) 尾数(52bit)

原理说明:

1)第1位为符号位,0为整数,1为负数;

2)第2-12位为指数位,共11位,不足11位前面补0,由于指数没有符号位,不能表示负数,只能通过将结果减1023来得到负数,所以指数位存储的结果是原指数加1023,即指数2存储后指数为 2+1023 = 1025(10) = 10000000 1(2);

3)第13-64位为尾数位,共52位,不足23位后面补0,尾数位包含隐藏的1.X,即1.0101011只存储0101011,然后后面补0,最终结果为0101 0110 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000。

double转十进制方法:

1)符号位0为正数;

2)指数转十进制,1000 0000 001为1025,需要减1023,所以指数为1025-1023=2;

3)尾数去掉后面的0,结果为0101 011;

4)尾数前面加1. 即:1.010 1011;

5)指数为2,小数点往后移2位,即:101.0 1011;

6)转十进制22 + 20 + 2-2 + 2-4 + 2-5 = 5.34375。

代码验证:

  double d = 5.34375;
  System.out.println(Long.toBinaryString(Double.doubleToLongBits(d)));

PS:double转换方法与float一致,区别在指数位算法有所差异,且尾数大小远远超过了float,因此精度也大大提高,正常情况下浮点数均采用double。

分享到:
评论

相关推荐

    java读取二进制文件

    ### Java读取二进制文件知识点详解 #### 一、二进制文件基本概念 在计算机科学中,二进制文件是由一系列字节组成的文件,这些字节可以表示任何类型的数据,包括文本、图像、音频等。二进制文件与文本文件的主要区别...

    S1 考试真题(笔试)

    1. 十六进制数制:在计算机科学中,十六进制是一种常用的数字表示方式,用于简化二进制数的表达。它使用0-9的阿拉伯数字和A-F的字母来表示0-15的数值。因此,十进制数15在十六进制中用F表示。 2. Java程序执行:...

    java随机生成十六进制颜色

    ### Java随机生成十六进制颜色知识点详解 #### 一、十六进制颜色代码的基本概念 在Web开发中,颜色常以十六进制形式表示。一个完整的十六进制颜色代码由六个字符组成,其中前两个字符表示红色(Red)的强度,中间...

    java数据类型与二进制详细介绍

    Java 数据类型与二进制详细介绍 Java 数据类型是 Java 语言的基础,它们决定了变量的类型和占用内存的大小。在 Java 中,基本数据类型可以分为四类:整数类型、小数(浮点数)类型、布尔类型和字符类型。 整数类型...

    磨砺营马剑威java培训第二课课程课件

    ### Java基础语法功能详解 #### 1. 变量 - **数学名词**: 在数学中,变量是指没有固定值的数,它可以改变。通常用非数字的符号来表示,比如拉丁字母。变量与常数相对。 - **计算机解释**: 在计算机科学中,变量指...

    Python数据结构

    - **语法**:`&lt;string&gt;[&lt;start&gt;:&lt;stop&gt;:&lt;step&gt;]` - **作用**:从字符串中提取子字符串。 - **注意事项**: - 索引从0开始,索引范围是 `0` 至 `len(string)-1`。 - 支持负索引,从 `-1` 开始倒数。 示例: ```...

    2021-2022计算机二级等级考试试题及答案No.542.docx

    20. 八进制到二进制转换:每个八进制数对应三位二进制数,例如八进制100等于二进制100000。 21. 输入/输出设备:计算机与外部世界的交互依赖于输入/输出设备,如键盘、鼠标、显示器等。 22. 五代计算机:超大规模...

    IEEE-754标准 定义浮点数转换工具

    提供的`IEE.exe`工具显然是一个实用的IEEE-754转换器,能够方便用户将十进制浮点数转换成IEEE-754标准的二进制表示,反之亦然。`说明介绍.url`可能指向一个包含该工具使用方法和更多细节的在线文档或网站。在实际...

    2021-2022计算机二级等级考试试题及答案No.9568.docx

    2. MySQL 二进制日志:MySQL的二进制日志记录了所有更改数据库的数据和结构的SQL语句,但不包括执行时间信息。它主要用于数据恢复和复制。默认情况下,MySQL可能不开启二进制日志,启用它可能会略微影响系统性能。 ...

    125集专攻JAVA基础 JAVA零基础入门学习视频教程 动力节点JAVA视频教程.txt

    北京动力节点-Java编程零基础教程-042-Java基本语法-二进制到十六进制数的转换.avi 北京动力节点-Java编程零基础教程-043-Java基本语法-八进制、十六进制转换为十进制数.avi 北京动力节点-Java编程零基础教程-044...

    Java软件开发实战 Java基础与案例开发详解 3-2 数据的分类 共9页.pdf

    ### Java软件开发实战:Java基础与案例开发详解 #### 3-2 数据的分类 本文档深入探讨了Java中数据的分类,这是学习任何编程语言的基础。数据分类不仅包括基本数据类型,还涉及数据进制及其转换等内容。下面将详细...

    2021-2022计算机二级等级考试试题及答案No.18008.docx

    2. 二进制数扩展:非零无符号二进制整数后添加一个0,其值会翻倍,因为二进制的每一位代表的是2的幂次。 3. ASCII码存储:计算机中,信息通常以二进制形式存储,ASCII码是7位二进制表示的字符编码,但并非所有信息...

    Java 类集(很全)

    - **字节流和字符流**:字节流主要用于处理二进制数据,如文件的读写,而字符流则更适用于文本数据的处理。主要包括以下几类: - **字节流**:`OutputStream` 和 `InputStream` 及其子类,如 `FileInputStream` 和 ...

    java谜题中文版

    尽管`printf`方法可以格式化输出,使其看起来正确,但这只是表面现象,底层的计算仍然是基于二进制浮点数的近似值。 **解决方案:** 为解决货币计算中的浮点数问题,应使用整数类型(如`int`或`long`),并以分为...

    2021-2022计算机二级等级考试试题及答案No.10175.docx

    16. C++支持的数制:C++支持十进制、十六进制和八进制,但不直接支持二进制表示。 17. 事件监听器:在Java或其他事件驱动编程中,一个控件可以注册多个监听器,监听不同的事件。 18. 数据源连接:在.NET框架中,...

    Java解惑中文版(带索引)

    - **二进制浮点数限制**: 不是所有的小数都能被精确表示为二进制浮点数。例如,`1.1`无法被精确表示,导致最终计算结果出现误差。 - **解决方案**: 1. **使用`DecimalFormat`格式化输出**: ```java DecimalFormat...

    2022年Java程序员面试题详解.docx

    - `(11.5)`在二进制中是不精确的,因为浮点数的存储方式决定了它不能精确表示所有十进制数。 11. **short类型的变量运算**: - `s1 = s1 + 1;`需要类型提升,可能造成溢出,需要显式转换。 - `s1 = 1;`直接赋值...

    IT java 面试题库

    2. **如何在java中实现文本文件和二进制文件的copy?** - 对于文本文件,可以使用`BufferedReader`和`BufferedWriter`;对于二进制文件,可以使用`FileInputStream`和`FileOutputStream`。 #### 八、JDBC 1. **...

Global site tag (gtag.js) - Google Analytics