Java中的double类型数据存储探析
一.double类型的存储表示
Java的浮点类型表示完全按照IEEE754标准(Standards of IEEE 754 floating point numbers),有兴趣可以上IEEE标准网站(www.ieee.org)查阅.该标准的内容基本上描述了浮点类型的存储格式(Storage Layout),下面我从中总结几段,来概括该标准,详细信息请查阅标准原文.
1.什么是浮点数.
计算机上表达实数有两中方法:定点表示(fixed-point)和浮点表示(floating-point).
定点表示法就是在现有的数字中间的某个位置固定小数点,整数部分和小数部分的表示和一个普通整数的表示法没什么两样.例如,我们的数字长度为4,小数点位于中间,那么你可以表示10.28,也可以表示00.01,与这种方法性质类似的定点表示还有使用分数的形式.定点数的固定窗口形式使得他既不能够表示非常大的数又不能表示非常小的数.并且当除法发生时,大量 的精度丢失.
浮点数采用科学计数法的形式来表示实数.例如123.456可以表示成1.23456×102.相对于定点数的固定窗口(fixed Window)的限制,它采用的是浮动窗口(sliding window),因此可以表示较大精度范围的一个实数.
2.存储布局(Storage Layout)
所谓的存储布局就是一个浮点数在内存中如何表示.我们知道浮点数有float和double,前者是4个字节也就是32位,后者是8个字节也就是64位.布局分别为:
符号 指数 小数部分 偏移附加(bias)
单精度 1[31] 8[30-23] 23[22-00] 127
双精度 1[63] 11[62-52] 52[51-00] 1023
中括号内为位的编号范围,外面为该部分所占有的位的数量.偏移附加不属于位表示的内容,是一个常量,稍后解释.
符号 只有一位:0-表示正数 1-表示负数
指数部分:用指数部分的值(8位/11位,unsigned)的值 减去 偏移附加 得到该数实际的指数 例如值为200,实际指数为73=200-127.对于双精度的double来说常量bias=1023
尾数:尾数是什么?对于一个科学计数法来讲,形式象这样的 L.M×BE,那么这个L.M就是所谓的尾数(mantisa).它由一个起始位和一个小数部分组成.举个例子,5可以用科学计数法表示成不同形式:
5*100
0.5*101
50*10-1
那么我们引进一个概念,规范化形式(normalized form)和非规范化形式(denormalized form).我们定义规范化形式为小数点位于第一个不为0的数字后面的表达形式为规范化形式,因此上面的第一种形式为规范化形式,其他的为非规范化形式,Java中的浮点表示完全按照这个标准,只有两种形式规范化形式:1.f 和 非规范化形式 0.f .
二、BigDecimal对于浮点树的处理
public BigDecimal(double val, MathContext mc) {if (Double.isInfinite(val) || Double.isNaN(val))throw new NumberFormatException("Infinite or NaN");// Translate the double into sign, exponent and significand, according// to the formulae in JLS, Section 20.10.22.long valBits = Double.doubleToLongBits(val);int sign = ((valBits >> 63) == 0 ? 1 : -1);int exponent = (int) ((valBits >> 52) & 0x7ffL);long significand = (exponent == 0? (valBits & ((1L << 52) - 1)) << 1: (valBits & ((1L << 52) - 1)) | (1L << 52));exponent -= 1075;// At this point, val == sign * significand * 2**exponent. 这就是那个公式//.....this.intVal = intVal;this.intCompact = compactVal; //最后转化成定点型,因此做运算更准确些this.scale = scale;this.precision = prec;}
Java中的double类型数据存储探析相关推荐
- java double 类型_关于Java中的double类型数据
在初学Java的时候,一般我们都会从基本的数据类型开始学习,而在基本数据类型中,我认为double类型是比较难理解的,并且在以后的学习或工作中,在double类型数据这遇到的坑也是极多的.例如下面的这 ...
- java中的double 类型数据相加问题
问题描述:比如说 double a=3.0 double b=4.0 我 把a+b用 system.out.println输出 得到7.000000000000000006 解决方法:做float或d ...
- Java学习之double类型数据比较
Java学习之double类型数据比较 对于两个double类型的数据,是不能直接用==来比较是否相等 double a=1.01; double b=1.01; if(b==a){System.ou ...
- 20190408 Java中的Double类型计算
打个桩 转载于:https://www.cnblogs.com/smallwangmusk/p/10674397.html
- java通过poi读取excel中的日期类型数据或自定义类型日期
java通过poi读取excel中的日期类型数据或自定义类型日期 Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2019,而Excel中输入的是 2019/10/12 ...
- mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区
关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...
- 关于MYSQL中FLOAT和DOUBLE类型的存储
关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方式和C/C++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定 ...
- Java如何给Mysql中插入year类型数据
文章目录 Java如何给Mysql中插入year类型数据 实际问题: 解决方案: 从数据库中读取year类型数据到Java 从Java中往数据库存储year数据 Java如何给Mysql中插入year ...
- c语言中数据精度发生错误,C语言Double类型数据保证精度有关问题
C语言Double类型数据保证精度问题 我用手算算出的数据为-1.35323517,但是在C语言里面为了保证数据精度,VC++运行的结果为-1.35323517024517 ,按说应该在-1.3532 ...
最新文章
- 【 全干货 】5 分钟带你看懂 Docker !
- 一文看尽 27 篇 CVPR 2021 2D 目标检测论文
- Leetcode-998 Maximum Binary Tree II(最大二叉树 II)
- 受限玻尔兹曼机(RBM)与python在Tensorflow的实现
- Maximum sum(信息学奥赛一本通-T1305)
- gz是什么意思饭圈_饭圈黑话出圈,吃瓜还需揭秘文字?
- Oracle数据库资料收藏
- pyecharts中文手册
- dell进入u盘启动模式_戴尔主板bios设置u盘启动
- YYC蜻蜓S系统v1.9版本更新-增加任务功能-增加观看记录-下载记录-消息提醒等
- Spark rdd之sortBy
- 15-top命令详解
- SASE部署及应用场景探讨
- 关于debain缺少声卡和无线网卡专有驱动的解决办法
- mesos marathon mysql_管理mesos+Marathon,实践
- ElementUI介绍
- Unreal Open Day 2017 参会总结与心得
- 科学与宗教的和解:宇宙宗教情感是科学研究背后的动力
- Qt开发-QT Quick
- 校招慕课Java面试新手尊享课笔记——Java基础从数据类型到类