当向计算机中存入一个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 ...
随机推荐
- android蓝牙(二)——接收数据
在蓝牙开发中,我们有这种一个需求:我们的androidclient要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,androidclient就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持an ...
- vb.net 字符串的操作 应用
Module Module1 Sub Main() ' 定义3个字符串变量 Dim str1, str2, str3 As String '给str1,str2付初值 str1 = "Hel ...
- 【Hibernate】Illegal attempt to associate a collection with two open sessions
今天在用Hibernate对对象进行修改操作的时候报了这个错. 之前一直没什么错误,但是今天修改了一下表结构,增加了一个OneToMany的映射. 所以在我获取对象,重新set一个变量之后就报了这个错 ...
- F - Free DIY Tour(动态规划,搜索也行)
这道题可用动态规划也可以用搜索,下面都写一下 Description Weiwei is a software engineer of ShiningSoft. He has just excelle ...
- [Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)
题目链接:http://acm.swust.edu.cn/problem/1126/ Time limit(ms): 1000 Memory limit(kb): 65535 上一周里,患有XX症的哈 ...
- PHP学习笔记2-流程控制
条件控制:if <?php function getLevel($score){ if($score>=90){ return "优秀"; }elseif($score ...
- django-extensions
命令行: admin后台管理扩展 后面会出现个放大镜实现搜索补齐功能. 交互式的 Python Shells(shell_plus) 实现自动导入 如果遇到apps中包含的的models名字出现冲突, ...
- MVC中Controller里写alert的问题
controller: Viewbag.a=true; 页面中 @if(Viewbag.a!=null) { <script> alert('XXX'); </script> ...
- hdu 1528 Card Game Cheater ( 二分图匹配 )
题目:点击打开链接 题意:两个人纸牌游戏,牌大的人得分.牌大:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < ...
- 手势滑动结束 Activity(一)基本功能的实现
喜欢听音乐的朋友可能都看过天天动听这款 app, 这款 app 有一个亮点就是在切换页面(Fragment)的时候能够通过手势滑动来结束当前页面.这里先说一下,我为什么会这么关心这个功能呢,由于前两天 ...