博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化(转)...
阅读量:5825 次
发布时间:2019-06-18

本文共 1879 字,大约阅读时间需要 6 分钟。

 problom :

'f1' value hava been changed when output.

reason :

the binary repersentation of 2.2f is : 00110011001100110011...

(is an infinite recurring decimal)

but computer only store 24 byte , so discard the remaining number , lead to the value has been change .

 

public class TestFloat {    public static void main(String[] args) {        float f1 = 2.2f;        System.out.printf("before conversion float1 :  %10.9f \n", f1);        double d1 = (double) f1;        System.out.printf("after conversion double1 : %10.9f \n", d1);        float f2 = 2.25f;        System.out.printf("before conversion float2 :  %10.9f\n", f2);        double d2 = (double) f2;        System.out.printf("after conversion double2 : %10.9f \n", d2);    }}
before conversion float1 :  2.200000048 after conversion double1 : 2.200000048 before conversion float2 :  2.250000000after conversion double2 : 2.250000000

 

从上面我们可以看出,向计算机中存入float类型的数值2.2 后,在输出会出现数值发生了变化,在注释中我已经说明了问题和导致这个问题的原因,由于我的英语有待提高,所以在这再重复一遍:

问题:

当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化。

原因:

要将浮点数值2.2存入计算机中,要进过下面几个步骤:

--》机器将2.2 转换成二进制形式。整数位2即是10,小数部分就不同了,根据乘2取整法计算0.2的二进制表示你会发现它是一个无限循环数--0011 0011 0011……,所以2.2 的二进制表示为: 10.0011 0011 0011 …… 。

--》将2.2的表示转换成科学计数法  即 : 1.0 0011 0011 0011 …… X 2^1

--》存储 , 浮点数计算机中分配的存储容量为32个字节(不知道是不是所有的语言或者所有的计算机都是这样,待以后更正),分配情况为:

      符号位     1

      指数位     8

      尾数位    23

  但是在科学计数法下,尾数的首数值一定是1,所以第一位不存储,这样就能为float增加一位精度,为24位。2.2 的存储如下:

      符号位   : 0(表示正)

      指数位   :采用移位存储,元数据为127 ,所以该部分应该存储 127 + 1 ,即128 : 1000 0000

      尾数位   : 因为尾数位只有24位,所以要截取无限循环小数部分的前24位,注意 : 截取造成了数值的改变。

根据尾数位的存储便可发现,计算机中2.2 的存储已经发生了变化,而且存储的值比2.2 要大,主要是存储的小数部分要比0.2 要大。具体原因可以算一下。因为小数部分转换成十进制每位要乘以10^(-X),当小数部分的位数减小,那么相应的X要减小,由于是X前面有个 - 号,所以值就变大了。

上面提供的是Java代码,同样在C语言中也是这样:

1 #include 
2 int main(){3 float f1 = 2.2 ;4 printf("%10.9f",f1);5 return 0;6 }

http://www.cnblogs.com/caiyao/p/3661627.html

 

你可能感兴趣的文章
大数据常用基本算法
查看>>
JavaScript学习笔记(十三)——生成器(generator)
查看>>
hibernate保存失败
查看>>
MySQL增量订阅&消费组件Canal POC
查看>>
Sqlite多线程
查看>>
数据结构-时间复杂度
查看>>
对象与字符串相互转换
查看>>
[NOIp2017提高组]小凯的疑惑
查看>>
《C程序设计语言》练习1-5
查看>>
$\frac{dy}{dx}$ 是什么意思?
查看>>
Go开发之路(目录)
查看>>
RHEL6.5安装成功ORACLE11GR2之后,编写PROC程序出错解决方法
查看>>
(50)与magento集成
查看>>
Ubuntu设置python3为默认版本
查看>>
JsonCpp 的使用
查看>>
问题账户需求分析
查看>>
JavaSE-代码块
查看>>
爬取所有校园新闻
查看>>
32、SpringBoot-整合Dubbo
查看>>
python面向对象基础
查看>>