前几天,看java核心卷上面有一句java的int转float会有精度丢失的问题,
第一次看的不太深入,最近又碰到了这个问题,就去深入的看了下。

建议一块看看这些(有助于理解下面的问题)

源码,反码,补码相关
IEEE754标准

大家乍一看float的范围比int大得多啊,那么包含它应该没问题啊,事实反应出来的确实另一个问题。

转化为什么会有精度丢失的问题呢??

因为二者的存储结构决定的。

int是准确值,而float是精确值,准确转精确当然会精度丢失。
int和float的存储结构不一致的原因导致的。

int的存储结构是:
一个符号位 31个指数位

如果你看了上面的补码的话,应该能够理解并且能计算出int的最大/小值范围了。

理论上,指数全为1即为最大/小值。
maxInt = 2*1的0次方+2*1的1次方+2*1的2次方+....+2*1的30次方 = 2的31次方-1
minInt = -2的31次方-1
但是你去看下java中定义的int的最大/小值却发现,最小值却不是上面那个,而是-2的31次方。为什么呢?
原因就是补码啊.用补码可以来向下表示1. 详情可以看看我上面推荐的那篇文章(好好看,不难的)。看完了,你就应该明白我说的啦。-2的31次方存储的格式应该就是 10000000 00000000  00000000 00000000

而float虽然也是4字节32位,但是float的存储结构是很不一样的

以这一例子来说明,由图可知,float的存储结构是1个符号位,8个指数位,23个尾数。

符号位,表述浮点数的正或者负,0代表正,1代表负。

指数位,实际也是有正负的,但是没有单独的符号位,在计算机的世界里,进位都是二进制的,指数表示的也是2的N次幂,8位指数表达的范围是0到255,而对应的实际的指数是-127到128。也就是说实际的指数等于指数位表示的数值减127。这里特殊说明,-127和+128这两个指数数值在IEEE当中是保留的用作多种用途的,这里就不多做介绍了,有兴趣的可以查阅其他资料。

尾数位,只代表了二进制的小数点后的部分,小数点前的那位被省略了,当指数位全部为0时省略的是0否则省略的是1。

由此我们可以明白,实际上尾数确定了浮点数的精度,而数的大小主要是靠指数位,尾数只有23位,加上省略的那一位便是24位,float只能有24位来确定精度,而int是32位。其他类型也如此进行理解即可。

——————-补充——————-

java中的float类型遵循 IEEE754标准(这个规定了二进制浮点型数标准)。

举个例子来说明下吧。

12.5在计算机中的储存结构是什么样呢??

先将十进制转化为二进制
12.5(10) = 1100.1(2) 这个不会的去搜下十进制转二进制。

然后计算尾数。
也就是最后的23位,第24位默认为1。所以1100.1左移3位即为1.1001,又因为高位位1,所以1可以省略,所以尾数部分为 1001000 00000000 00000000。

再然后呢,就是计算指数。
刚才计算尾数左移了3位,相当于乘以2的3次方即为8,再加上127即为最后的指数,10000111,

因为是正数,所以符号位为0

12.5在计算机中的储存就是
0 1000011 1 1001000 00000000 00000000

我在看的时候还纠结一个问题,那就是关于float最大最小值的问题。

通过上面的那个公式还有那个IEEE754标准 就可以算出float的最大值及最小值,包括浮点型的有效位数。

大家可以自己先挣扎下,我明天再写。

float的取值范围:
负无穷 —— −2的128次方 ~~~ −2的149次方 —— 0 —— 2的149次方 ~~2的128次方 —— 正无穷

有意义的指数,正规形式的最大,取其最大值2的8次方-2,即为254,减去127,即为实际计算的指数127.
后面的指数都为1的情况下,值最大。
大家套用上面那个图上的公式。
(-1) sign次方 * 2的127次方 * (1+1*2的-1次方+1*2的-2次方+…+1*2的-23次方)

maxOrMinValue = (+/-)2的127次方*(1+(2的23次方-1)/2的23次方)

这个就是它的最大/小值。接近(+/-)2的128次方,但是取不到128次方的值。

至于(+/-)2的-149次方,这个怎么得出来的。 按照非规约形式得到的。

指数部分为0的情况下,减去127得到实际计算指数-127,后面位数部分在非规约模式的情况下,不能为0最小的情况就是指数为0位值为1,也就是2的-23次方。
两者相加,是(+/-2的150次方)。 为什么是149次方呢。解释是全0,1位特殊值,不做范围内取值,所以指数位最小为1.则实际计算指数则为-126.最终的结果就是(+/-)2的149次方。
这样就计算得出了。

在IEEE754标准 中还规定了无穷大,无意义的值,有兴趣可以去看下啊。

float精度值

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

你可以用大于2的30次方的int类型数强转成float对比下,看看是不是出现了精度丢失。

参考链接
参考链接1

java int转float精度丢失问题相关推荐

  1. Java int转float 精度损失

    int n = 123456789; float f =n; 打印f,发现f=1.23456792E8,发生了精度损失. 我起初的疑问,float取值范围比int取值范围大,为什么会出现精度损失那? ...

  2. double java 精度丢失_java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  3. 关于double与float精度丢失问题~看完我明白了☆

    今天刷面试题时,看到了(精度丢失)这个问题,今天来通过参考资料,把它总结一下 目录 ①<精度丢失>长什么样? ②为什么会精度丢失? ③用BigDecimal类解决精度丢失的问题 ①< ...

  4. java int 0.5_java int转float精度缺失原因?

    long的范围大于double long与float的丢失原理同下: 1)小数转换成二进制: 整数和小数分别转换. 整数除以2,商继续除以2,得到0为止,将余数逆序排列. 22 / 2 11 余0 1 ...

  5. float转int的时候精度丢失

    php中float转int精度丢失的问题 今天遇到一个问题,$19.99转换为内部货币时的比例是1:100,所以乘以100,结果是1999,但是订单信息描述中将数据转换为int(不确定, 因为里面是将 ...

  6. java中double类型精度丢失问题及解决方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源: https://blog.csdn.net/yacolsp ...

  7. Java中BigDecimal解决精度丢失问题

    1.我们先看一个例子 可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题.那么我们如果在进行商品价格计算的时候,就会出现问题.很有可能造成我们手中有0.06元,却无法购买一个0.05元和一 ...

  8. int和float精度

    int!!!!! float(有效位数6-7位)类型从第八位开始丢失精度: int是存入整型数据.所以存入的整数是多少就是多少.不会丢失精度. float是浮点型,浮点型数字一旦小数点后面数字多了必然 ...

  9. BigDecimal操作double、float精度丢失问题

    一.问题 最近使用BigDecimal进行数值加减运算的时候踩了一个小坑:BigDecimal操作double.float数值时精度丢失. 举个例子: public static void main( ...

最新文章

  1. 分布式存储 Ceph 介绍及原理架构分享--云平台技术栈系列01
  2. AI 实验--v_JULY_v
  3. hive 安装_7.Hive介绍以及安装
  4. Dubbo--zookeeper面试中问题解答
  5. C++之全局函数和成员函数互相转换
  6. android+动画队列,Android属性动画详解
  7. 2017\National _C_C++_C\1.哥德巴赫分解
  8. LeetCode 299. Bulls and Cows
  9. The setting logImpl is not known
  10. log4net使用注意
  11. DB2 ResultSet用法
  12. freemarker中空值“”,null值的判断
  13. 【MTSP】基于matlab遗传算法求解多旅行商问题【含Matlab源码 016期】
  14. vue vuex 挂载_【HAVENT原创】Vue 中使用 Vuex 的几种写法
  15. java毕业设计博雅楼自习室预约系统Mybatis+系统+数据库+调试部署
  16. Siki学院换装项目的MVC实现
  17. 上海汉枫电子推出能“听”会“说”的物联网Wi-Fi模块
  18. 银屑病与大肠相关机制(调研手稿五)
  19. Android 号牌号码识别,支持新能源车牌,离线识别
  20. Macbook的常用快捷键

热门文章

  1. Lucene入门及实际项目应用场景
  2. 初识SkyWalking
  3. 对于 CRC 校验的 学习笔记
  4. 微服务集成Sentine--服务雪崩效应以及常见的容错方案
  5. python操作cad
  6. Hifiman:一个国产音频厂商的忧伤[转]
  7. 同城跑腿系统源码,点对点配送,帮你省时省力
  8. 苹果android是什么,如果用苹果最新的芯片运行安卓系统会是什么情况?
  9. CSS基础学习——动画
  10. 【可信计算】第四次课:PKI关键技术