一文帮你读懂Java浮点数的存储原理

前言

        Java数值分整数和浮点数,前一篇文章已经解析了Java整数的存储原理,本篇将接着解析浮点数在计算机里的存储原理。Java浮点数分单精度类型( float)和双精度类型(double),float 数据占用 32bit,double 数据占用 64bit。

Java浮点数标准

        java中浮点数采用的IEEE754标准,该标准的全称为IEEE二进制浮点数算术标准。这个标准规定的存储格式是这样的:符号位+指数位偏移+尾数位

存储格式

IEEE 754常用的两种表示浮点数值的方式:单精确度(float 32位)、双精确度(double 64位)
存储格式

  • 浮点数表示的数值:V = (-1)^s × M × 2^E
  • 符号(sign) :1个bit表示,当s=0,V为正数;当s=1,V为负数。
  • 阶码(exponent) :E的作用是对浮点数加权,用于存储科学计数法中的指数数据,并且采用移位存储。float类型的阶码是 8 bits,double类型的阶码是 11 bits。
  • 尾数(significand) :M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M<2。(和十进制中范围为1~10一样)

        IEEE 754对有效数字M和指数E,还有一些特别规定。前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存 M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位float浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。 道理就是在这里,那 24bit 能精确到小数点后几位呢,我们知道 9 的二进制表示为 1001,所以 4bit 能精确十进制中的 1 位小数点, 24bit 就能使 float 能精确到小数点后 6 位

        至于指数E,情况就比较复杂。 首先,E为一个无符号整数(unsigned int)这意味着,如果E为8位 (float类型) ,它的取值范围为0~255;如果E为11位(double类型),它的取值范围 为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的(因为0.75用科学计数法表示就是1.1*2^-1),所以 IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

浮点数转二进制数

能精确表示的浮点数

哪些小数能被精确表示呢?0.5的倍数,且在精度以内。
方便计算,首先选择可以用浮点数精确表示的数计算:4.25

-step1.首先将数字转为2进制:
整数部分4: "除2取余"
4/2=2 余 0
2/2=1 余 0
1/2=0 余 1

小数部分0.25:"乘2取整"
0.25 * 2 = 0.5 未进位 0
0.50 * 2 = 1 进位整数 1
二进制表示:100.01

step2.将二进制数转为科学计数法表示
科学记数法表示:1.0001 * 2^2

step3.转换为IEEE754格式存储
符号位 0 (正数0 负数1)
指数 2 (float指数+127=127 double指数+1023=1025)
尾数 0001

单精度float:符号位0     指数位129(10000001)     尾数001
0 10000001 00010000000000000000000

双精度double:符号位0 指数位1025(10000000001) 尾数001
0 10000000001 0001000000000000000000000000000000000000000000000000

不能精确表示的浮点数

举个例子:1/3,十进制就无法精确表示三分之一这个数字。

二进制也有很多很多小数无法精确表示,包括:0.1和0.2,这也是导致计算出现精度问题的根本原因。

下面将0.1转为2进制表示。

0.1
step1.首先将数字转为2进制:
0.10 * 2 = 0.20 未进位 0
0.20 * 2 = 0.40 未进位 0
0.40 * 2 = 0.80 未进位 0
0.80 * 2 = 1.60 进位 1
0.60 * 2 = 1.20 进位 1
0.20 * 2 = 0.40 未进位 0
0.40 * 2 = 0.80 未进位 0
0.80 * 2 = 1.60 进位 1
0.60 * 2 = 1.20 进位 1
无限循环(0011)...

二进制表示0.1:
0.00011001100110011001100110011001100110011001100110011001...

step2.将二进制数转为科学计数法表示
科学记数表示:
1.1001100110011001100110011001100110011001100110011001... * 2^-4

step3.转换为IEEE754格式存储
符号位 0 (正数0 负数1)
指数 -4 (float指数+127 double指数+1023)
尾数 1001100110011001100110011001100110011001100110011001...

float 单精度浮点数,尾数只能存储23位,多余位数四舍五入:
0 01111011 10011001100110011001101

double 双精度浮点数,尾数只能存储52位,多余位数四舍五入:
0 01111111011 1001100110011001100110011001100110011001100110011010

结语

        本文详细解读了Java浮点数(包括单精度和双精度)在计算机中的存储原理,并且采用示例讲解了浮点数转换成二进制的方法,希望大家看完本篇后能够弄清楚浮点数是怎么在计算机中存储的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容