`
uuu999ggg
  • 浏览: 42579 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

int, float, double之间不得不说的故事

 
阅读更多

int整型: .net中特指Int32为32位长度符号整型变量

float:单精度浮点数32位长度1位符号位8位指数位与23位数据位 .net中又称为Single

double:64位长度双精度浮点数1位符号位11位指数位52位数据位

它们互相关系就:int可以稳式转换成float和double,float只能强制转换成int但可以隐式转换成double,double只能强制转换成float和int

 

 
  废话说完这就出现了几个困难而且比较意思困难

  1 int i = Int32.MaxValue;

  2 float f = i;

  3 int j = (int)f;

  4 bool b = i == j;

  这里b=false。刚才这个操作,如果我们把float换成long,第一次进行隐式转换,第二次进行强制转换结果将会true。乍一看float.MaxValue比int.MaxValue大了不知道多少倍,然而这个隐式转换中却造成了数据丢失。int.MaxValue这个值等于2^31-1,写成二进制补码形式就01111…(31个1)。这个数表示成float计数科学计数法时候将会写成+0.1111…(23个1)*2^31。对于那31个1里面最后8个被float无情抛弃了。因此再将这个float强制转换回int时候,对应int二进制补码表示已经变成了0111…(23个1)00000000。这个数与最初那个int相差了255,所以造成了不相等。

  那么提出另一个困难,嘛样int变成float再变回来和从前值相等呢?这个困难其实完全出那23位float数据位上了。对于一个int把它写成二进制形式之后成为了个一32个长度0、1排列对于这个排列只要第一个1与最后一个1之前间距不超过23,那么它转换成float再转换回来两个值就会相等。这个困难与大小无关而且这个集合int这个全集下并不连续。

  1 double d = 0.6;

  2 float f = (float)d;

  3 double d2 = f;

  4 bool b = d == d2;

  这里b也false。刚才这个操作如果开始另d等于0.5结果就将会true。乍一看0.6这个数这么短,double和float都肯定能够表示那么转换过去,再转换回来结果理应相等。其实这因为我们用十进制思考困难太久了。如果我们0.6化成二进制小数,可以发现得到结果0.10011001……(1001循环)这一个无限循环小数。因此不管float还double它存储0.6时候都无法完全保存它精确值(计算机不懂分数呵呵)。这样话由于float保存23位,而double保存52位,就造成了double转化成float时候丢失掉了一定数据,再转换回去时候那些丢掉值被补成了0。因此这个后来double和从前double值已经不再一样了。

  这样就又产生了一个困难,嘛样double转换成float再转换回来两个值相等呢?其实这个困难与刚才int那个困难惊人相似(废话都和float打交道能不相似么)只不过我们还需要考虑double比float多了3位指数位,太大数double能表示但float不行。

  还一个算数学上困难嘛样十进制小数表示成二进制不无限小数呢?这个困难可以说完全成为数学范畴内困难了,但比较简单,答案也很明显。对于所最后一位以5结尾十进制限小数都可以化成二进制限小数(虽然这个小数可能长到没谱)。

  最后一个意思困难,刚才说过0.6表示成为二进制小数之后0.1001并且以1001为循环节无限循环小数,那么我们将它存成浮点数时候一定会某个位置将它截断(比如float23位和double52位)。那么真正存内存里这个二进制数转化回十进制到底比原先十进制数大呢还小呢?答案It depends。人计算十进制时候四舍五入,计算机再计算二进制小数也挺简单就0舍1入。对于float要截断成为23位,假如卡24位上1那么就会造成进位,这样话存起来值就比真正十进制值大了。如果0就舍去,那么存起来值就比真正十进制值小了。因此这可以合理解释一个困难,就0.6d转换成float再转换回double,它值0.60000002384185791这个值比0.6大,解释就0.6二进制科学计数法表示第24位1造成了进位

  到了这里仍然一事不解,就对于浮点数硬件虽然给予了计算上支持但它与十进制之间互相转换到底怎么样做到呢。又谁做呢(汇编器还编译器)这个东西突出体现存内存里数明显实际与0.6不等但无论哪种语言都能够Debug以及输入时候将它正确显示成0.6提供给用户(源代码员)。最好实例就double和ToString办法如果我写double d=0.59999999999999999999999999999d.ToString()给我0.6。诚然对于double来说,我写那个N长数与0.6内存里存东西一样,但计算机又如果处理方案了,将一个实际与0.6不相等数变回0.6并显示给我呢?关于这个困难欢迎大家讨论并请高手指教一二?

转自http://www.aicuxiao.com/code/view2358.html

分享到:
评论

相关推荐

    不得不看的100个C语言经典范例

    1. **变量与数据类型**:C语言中的基本数据类型包括整型(int)、浮点型(float/double)、字符型(char)等,范例会展示如何声明、初始化和操作这些类型的变量。 2. **运算符与表达式**:C语言支持多种运算符,如...

    c程序设计语言【精】002.

    - 关键词(如 `if`, `else`, `int`, `float` 等)不能作为变量名使用。 **内部名字与外部名字:** - 内部名字至少前31个字符是有效的。 - 函数名和外部变量名可能会受到汇编程序和链接器的限制。 - 对于外部名,...

    java小结

    ` 此处`int`被自动转换为`double`。 - **强制类型转换**: - 当需要将较大类型的数据赋值给较小类型时,需要使用强制类型转换。 - 示例: `double d = 12.5; int i = (int)d;` 结果`i`为`12`,而非`13`,这是因为...

    大学C语言期末考试题库试题及答案汇总.docx

    - C语言中最简单的数据类型包括整型(int)、实型(float/double)和字符型(char)。 8. **合法的C语言关键字**(题目8): - 选项D `default` 是C语言的关键字之一,用于switch语句。 9. **不能定义为用户标识符**...

    c#简易教程

    2. 浮点型变量:包括单精度浮点型(`float`)和双精度浮点型(`double`)。C#也提供了长双精度浮点型(`decimal`),适合需要更高精度的金融计算。 3. 字符型变量:通常使用`char`类型,存储单个字符。 变量还需要...

    Java入门第一季

    基本数据类型包括整型(如int)、浮点型(如float和double)、字符型(char)和布尔型(boolean)。引用数据类型如String,用于存储字符串。 在Java中,变量必须先声明后使用,可以同时初始化或分开初始化。变量...

    C#测试题不得不看,想要训练自己就要看看

    1. 变量与数据类型:C#中的基本数据类型包括整型(int, short, byte等)、浮点型(float, double)、字符型(char)以及布尔型(bool)。理解它们的范围和用法是学习C#的第一步。 2. 控制流:掌握if语句、switch...

    C语言期末复习题及答案

    - 不得使用C语言的保留字(如`int`、`float`等)作为标识符。 - 标识符长度有限制,过长的标识符可能被截断。 2. **常量和变量的定义**: - 变量是在程序执行过程中其值可以改变的实体,如`int a;`定义了一个...

    第3章-最简单的C程序设计.ppt

    - `float`: 单精度浮点型,适用于精度要求不高的计算。 - `double`: 双精度浮点型,提供更高的精度。 - **字符型(char)**: 用于存储单个字符。 #### 3.2 常量与变量 - **常量**: 在程序执行过程中其值不会发生...

    C++编码规范.

    **原则3.8 若不得不使用参数不确定的函数,用提供的方法** - 如果必须使用参数不确定的函数,使用 `<stdarg.h>` 提供的方法。 - 示例:`int vprintf(const char *format, va_list arg);`. **原则3.9 避免函数的参数...

    ANSI C99标准文档

    C99标准文档对于C语言开发者来说非常重要,主要体现在以下几个方面: 1. **权威性**:作为C语言的官方标准,C99文档提供了最为准确、详尽的语言特性和用法说明。 2. **规范性**:通过遵循C99标准,开发者可以确保...

    java期末复习题一.docx

    Java中,数据类型转换分为自动类型转换(升序转换,如从byte到int)和强制类型转换(可能丢失精度,如从double到int)。转换时需要注意类型兼容性和可能的溢出问题。 【进制表示】 Java中,八进制数以`0`开头,十六...

    《你必须知道的495个C语言问题》

    你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。 《你必须知道的495个C语言问题》的出版填补了这一空白。许多知识点的阐述都是其他资料中所没有的,弥足珍贵。 涵盖...

    C++大学基础教程第二章

    - 实型:`float`、`double` - 逻辑型:`bool` 2. **自定义数据类型** - 数组:`type[]` - 指针:`type*` - 引用:`type&` - 空类型:`void` - 结构:`struct` - 联合:`union` - 枚举:`enum` - 类:`...

    java语法,足够详细

    简单类型包括布尔型(`boolean`)、字符型(`char`)、整型(`byte`, `short`, `int`, `long`)和浮点型(`float`, `double`)。复合类型则包括类(`class`)、接口(`interface`)和数组。每种数据类型都有其特定的...

    Csharp编程语法基础实用PPT学习教案.pptx

    - 不得使用C#的关键字作为变量名,如`if`, `else`, `int`, `class`等。 - **使用关键字作为变量名**:可以通过在关键字前面加上`@`符号来避免命名冲突,例如`string @string;`。 - **变量初始化**:C#要求变量在...

    《Java语言程序设计(一)》课后习题答案(课程编号04747)

    - 浮点型:float、double - 字符型:char - 布尔型:boolean **常量书写方式**: - 整型常量:10、-20、077(八进制)、0x1F(十六进制) - 浮点型常量:10.5、-3.14f - 字符型常量:'A'、'\u0041' - 布尔型常量:...

    C主要知识点

    - C++提供了多种内置数据类型,如 `int`, `float`, `double`, `char`, `bool`, 指针、数组和引用等。 **11. 字符类型** - 包括 `char`, `signed char`, `unsigned char`。 - `char`:通常占一个字节。 - `...

    C语言基本数据描述PPT课件.pptx

    - **浮点型**:`float`、`double` - **字符型**:`char` - **构造类型**: - **数组**:如`int arr[10];` - **结构体**:`struct Student { int id; char name[20]; };` - **联合**:`union Data { int i; ...

    64学时C/C++语言练习

    表达式 `a/b + c + 0.4` 中,`a` 和 `b` 分别为 `int` 和 `float` 类型,`c` 为 `char` 类型,而 `0.4` 是 `double` 类型。在进行加法运算前,`char` 类型会被提升到 `int` 类型,然后所有整数类型都会被提升到 `...

Global site tag (gtag.js) - Google Analytics