当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化(转)
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.250000000
after 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 <stdio.h>
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
当向计算机中存入一个float类型的数值2.2 后,在从计算机中读出输出,这时2.2 的值已经发生了变化(转)的更多相关文章
- ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象
java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象. ArrayList list ...
- C++中对一个布尔类型的变量按位取反结果不变
C++中对一个bool类型的变量按位取反是无效的.例如: bool a = true; bool b = ~a; // b的值还是true
- impala支持的数据库里的double(float)类型,通过迁移inceptor后,类型的值都变成了null
impala支持的数据库里的double(float)类型,通过迁移inceptor后,double类型的值都变成了null. 通过查阅日志发现默认将double转换成Decimal(38,10)然而 ...
- 中触发一个断点 其原因可能是堆被损坏,这说明 ***.exe 中或它所加载的任何 DLL 中有 Bug
软件中使用了DevComponents.DotNetBar2.dll MessageBoxEx.Show("ddd");运行到这句出现这个错误 : 中触发一个断点 其原因可能是堆被 ...
- 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM
题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...
- (C++)读取一个输入的int型十进制数字的位数,并正序输出每个位上的值(不同数位的值用1个空格字符间隔)
1 /* 2 程序功能:读取一个输入的int型十进制数字的位数,并正序输出每个位上的值(不同数位的值用1个空格字符间隔). 3 例如:当输入985这个数字时,显示如下信息: 4 985是一个3位数字! ...
- iOS中字符串转float类型失真的解决办法
最近在做项目的过程中,偶然遇到了一个问题,就是字符串和浮点类型的转换.以往都是通过[NSString stringWithFormat:@"%d",goodcount]这种方式转换 ...
- Java-在一个包装器对象中包装一个原始类型
使用基本类型的包装对象,好处可以为空且可以序列化 package com.tj; public class MyClass2 { public static void main(String[] ar ...
- Qt中实现将float类型转换为QString类型
在使用Qt Creator编程时,难免会用到将float类型转换为QString类型的时候下面是我所有的方法: 1. 将QString类型转化为float类型,很简单 QString data; fl ...
随机推荐
- Web Application的目录结构
Java web工程下的webapp或WebContent就是工程的发布文件夹,发布时会把该文件夹发布到tomcat的webapps里. 一个web应用必须要有的目录文件如下: webapp/WebC ...
- Hadoop集群配置(最全面总结)
Hadoop集群配置(最全面总结) 通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker.这些机器是masters.余下的机器即作为DataNode也作为Ta ...
- 制作Linux(Fedora、Ubuntu、CentOS)优盘启动
随着嵌入式技术的快速发展,Linux快速发展过一段时间.虽然现在不是很热,但是linux在现实社会的使用还是很有用处.而光盘有有些落伍,不仅浪费而且不环保,所以质优价廉的优盘就脱颖而出.所以,用优盘制 ...
- kingso_module - Taocode
kingso_module - Taocode 模块介绍 Merger 功能介绍 Merger的功能: 合并多台Searcher机器的部分查询结果,得到最终的完整查询结果 向Detail集群请求最终展 ...
- poj 2114 Boatherds 树的分治
还是利用点的分治的办法来做,统计的办法不一样了,我的做法是排序并且标记每个点属于哪颗子树. #include <iostream> #include <cstdio> #inc ...
- 【转】C++类-内存分布
C++类内存分布 - 转载自Jerry19880126 - 博客园 的文章 在上面这篇文章的基础上做了些整理. 主要讨论了C++类对象的内存分布结构. 来看看编译器是怎么处理类成员内存分布的,特别是在 ...
- Android 去掉Activity的跳转动画
startActivity或finish的时候调用一句话即可: overridePendingTransition(0, 0);
- jquery validate 插件使用小结
项目中整合了jquery validate插件,仿照别人的使用写了我的表单验证,结果不起作用.然后就各种找原因. 在网上下了jquery validate插件的完整包,看了看里边的例子,跟我的使用貌似 ...
- J2EE基础篇——十三个规范
背景: 1.企业级应用框架的需求,在很多企业级应用中.比如数据库连接.邮件服务.事务处理等都是一些通用企业需求模块,这些模块假设每次在开发中都由开发者来完毕的话,将会造成开发周期长和代码可靠性差等问题 ...
- STL 源代码剖析 算法 stl_algo.h -- equal_range
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie equal_range(应用于有序区间) ------------------------- ...