java float浮点型数据存储,丢失精度问题

java中float类型为4字节32位,内存中的存储遵循IEEE-754格式标准:

一个浮点数有2部分组成:底数m和指数e
底数m部分:使用二进制数来表示此浮点数的实际值。
指数e部分:占用8bit(1个字节)的二进制数,可表示数值范围为0-255。
但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。
所以,float类型的指数可从-126到128。
底数部分实际是占用24bit(3个字节)的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit。

所以一个浮点数的32位由三个部分组成:

1.第一位为符号位,表示改浮点数是一个正数还是负数,0为正,1为负;

2.第二到第九位共8为表示指数e,转成二进制需要+127(反之减去127);

3.后23位为底数,但是存储时自动省去了最高位的1,所以存储为23位实际为24位。(小数位置即为2^(23)=8388608       7位数  计算为6位数的精度)

举个栗子: 3.2f

转化为二进制存储:整数部分3  二进制  11

           小数部分0.2  转化为二进制(乘2取整数部分直至小数部分为零) ---->(小数乘2)   0.4  0.8  1.6  1.2  0.4  0.8   1.6   1.2  0.4 ...... (无限循环)

         结果为:11.00 1100 11001100 11001100 11001100(由于位数有限,而小数部分无限循坏,这里已经丢失了精度)

         右移直到左边只剩一位 :1.100 1100 11001100 11001100 11001100 (右移了一位,可得到指数部分为1+127=128   1000 0000)

         最后得到二进制的存储 : 0 100 0000 0100 1100 11001100 11001100 (丢失精度)

反之转化为浮点数十进制:符号位0 :正数

            指数 100 0000 0 即为128减去127 指数为1

            尾数部分:最高位1默认省去了加上小数点即为 1.100 1100 11001100 11001100

            正指数右移一位  11.0011 00110011 0011001100

            正数部分11---->3   底数部分   2^(-3)+2^(-4)+2^(-7)+2^(-8)+2^(-11)+2^(-12)+2^(-15)+2^(-16)+2^(-19)+2^(-20)

原文地址:https://www.cnblogs.com/gson-and-nana/p/8716530.html

时间: 2024-08-10 09:26:44

java float浮点型数据存储,丢失精度问题的相关文章

我的全栈之路-Java基础之数据存储

我的全栈之路-Java基础之数据存储 我的全栈之路 2.1 标识符 标识符是在程序开发时给包,类.接口.注解,变量,方法命名的字符序列. 标识符在命名时需要遵守相关的规则和规范: 标识符的命名规则: 标识符不能是Java的关键字和保留字,关键字是Java中被赋予赋予特殊含义的单词,例如public static void等等.保留字是现有Java版本尚未使用,但是未来的Java版本可能会做关键字使用的单词,例如goto,const.但是可以包含关键字,保留字. 标识符可以由字母.数字.下划线组成

Java中浮点型数据Float和Double进行精确计算的问题

一.浮点计算中发生精度丢失  大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个利用浮点型数据进行精确计算时结果出错的例子,使用Java编写,有所省略. double a = (1.2 - 0.4) / 0.1;System.out.println(a); 如果你认为这个程序的输出结果是“8”的话,那你就错了.实际上,程序的输出结果是“7.999999999999999”.好

浮点型数据存储方式

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53. 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign)

Java Float类型 减法运算时精度丢失问题

package test1; public class Test2 { /*** @param args*/public static void main(String[] args) {   Float xx = 2.0f;   Float yy = 1.8f;   Float tt = xx - yy;   System.out.println("tttttt-----" + tt); } } 果然输出结果是: tttttt-----0.20000005 再测试了几个float类型

JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。浮点型数据使用注意事项

JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储. 所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p id="

关于Java中用Double型运算时精度丢失的问题

注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1. 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情. 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错. BigDecimal在<Eff

MD3200存储中虚拟机数据文件丢失的数据恢复过程

简介: 由于MD3200存储中虚拟机的数据文件丢失,导致整个Hyper-V服务瘫痪,虚拟机无法使用,故障环境为Windows Server 2012服务器,系统中部署了Hyper-V虚拟机环境,虚拟机的硬盘文件和配置文件放在朝阳区某托管中心托管的DELL MD3200存储中(注:硬盘600G*4,4T*1).MD3200存储是由4块600G硬盘组成的阵列,用作存储虚拟机的数据文件.单块4T硬盘用作虚拟机数据文件的备份. 故障: 由于MD3200存储中虚拟机的数据文件丢失,导致整个Hyper-V服

【Android】数据存储-java IO流文件存储

1.数据持久化:将在内存中的瞬时数据保存在存储设备中.瞬时数据:设备关机数据丢失.持久化技术提供一种机制可以让数据在瞬时状态和持久状态之间转换. 2.Android中简单的三种存储方式:文件存储.SharedPreference 存储以及数据库存储. 1.文件存储 :不对数据作任何处理,将数据原封不动地存储到文件中,适合存储一些简单的文本数据和二进制数据. a.将数据存储到文件中 Context类提供了一个openFileOutput()方法,可以用于将数据存储到文件中.这个方法接收两个参数,第

Java基础知识强化之IO流笔记45:IO流练习之 把文本文件中数据存储到集合中的案例

1.  把文本文件中数据存储到集合中      需求:从文本文件中读取数据(每一行为一个字符串数据)到集合中,并遍历集合. 分析:      通过题目的意思我们可以知道如下的一些内容,      数据源是一个文本文件.      目的地是一个集合.      而且元素是字符串.      数据源:   b.txt -- FileReader -- BufferedReader  目的地:  ArrayList<String> 2. 代码示例: 1 package cn.itcast_02; 2