c# float和double的“坑”
定义一个float类型的变量=0.7,结果在IL中却是0.69999999。
乘以10之后,获取整数值。得到的却是6。通过查看IL,竟然被转换成double类型再转换。就变成6了。
Demo:

IL:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 93 (0x5d)
.maxstack
//定义变量
.locals init ([] float32 val,
[] int32 i)
IL_0000: nop
IL_0001: ldc.r4 0.69999999
//将0.69999999赋值给第0个变量。明明定义的是0.7
IL_0006: stloc.
IL_0007: ldc.i4.s
/将10赋值给第一个变量
IL_0009: stloc.
//double类型的0.7
IL_000a: ldc.r8 0.69999999999999996
IL_0013: ldloc.
IL_0014: conv.r8
IL_0015: mul
IL_0016: call float64 [mscorlib]System.Math::Floor(float64)
IL_001b: call void [mscorlib]System.Console::WriteLine(float64)
IL_0020: nop
IL_0021: ldloc.
IL_0022: call void [mscorlib]System.Console::WriteLine(float32)
IL_0027: nop
//从堆栈中加载出val
IL_0028: ldloc.
//从堆栈中加载出i
IL_0029: ldloc.
//将i转换为float类型
IL_002a: conv.r4
//val*i
IL_002b: mul
//将乘法运算之后的结果转换为double类型
IL_002c: conv.r8
//调用Math.Floor对运算后的结果处理
IL_002d: call float64 [mscorlib]System.Math::Floor(float64)
IL_0032: call void [mscorlib]System.Console::WriteLine(float64)
IL_0037: nop
IL_0038: ldloc.
IL_0039: conv.r8
IL_003a: call void [mscorlib]System.Console::WriteLine(float64)
IL_003f: nop
IL_0040: ldloc.
IL_0041: ldloc.
IL_0042: conv.r4
IL_0043: mul
IL_0044: conv.r8
IL_0045: call void [mscorlib]System.Console::WriteLine(float64)
IL_004a: nop
IL_004b: ldloc.
IL_004c: conv.r8
IL_004d: ldloc.
IL_004e: conv.r8
IL_004f: mul
IL_0050: call void [mscorlib]System.Console::WriteLine(float64)
IL_0055: nop
IL_0056: call string [mscorlib]System.Console::ReadLine()
IL_005b: pop
IL_005c: ret
} // end of method Program::Main
c# float和double的“坑”的更多相关文章
- Sql的decimal、float、double类型的区别
三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E ...
- float和double的精度
作者: jillzhang 联系方式:jillzhang@126.com 原网址:http://blog.csdn.net/wuna66320/article/details/1691734 1 范围 ...
- float和double精度问题
System.out.println(new BigDecimal(253.90).doubleValue() * 100);25390.0精度正确 System.out.println(new Bi ...
- float和double在内存中的存储方式
本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgX ...
- float、double的有效位数
Java中的浮点类型有两类,分别是float和double类型,其中float取_7__位有效数据,double取_15__位有效数据
- decimal,float和double的区别
http://www.cnblogs.com/yellowapplemylove/archive/2011/08/23/2150316.html 一直很奇怪C#的预定义数据类型中为什么加了一个deci ...
- 汇编学习:float与double速度问题
X86处理器包含两种类型的浮点数寄存器.第一种使用8个浮点寄存器组成浮点寄存器栈,另一种为向量寄存器(XMM,YMM),它们对于单双精度的处理是不同的.本文将讨论两种模式下的浮点数计算速度问题. 一. ...
- Effective Java 48 Avoid float and double if exact answers are required
Reason The float and double types are particularly ill-suited for monetary calculations because it i ...
- float,double和decimal的精度问题
先标注一个音标,因为我老是读错:decimal ['desɪml] 精度对比: 类型 CTS 类型 描述 有效数字 范围 float System.Single 32-bit single-preci ...
随机推荐
- make menuconfig 是一个目录。停止 错误解决
在移植Linux内核时候,发现用 make menuconfig 发生如下错误 linux@ubuntu:/work/linux-socfpga$ make menuconfig make: *** ...
- Centos安装软件小结-20160325
三种安装包 bin包 rpm包 源码包 1.bin包 1.先赋予权限: chmod 777 *.bin 2.开始安装: ./.bin 2.rpm包(以jdk为例)\ yum search jdk\ y ...
- JavaScript对象的创建总结
方式 缺点 优点 基于已有对象扩充属性和方法 不可重用,没有约束 无 工厂方法 检测不出是什么的实例 简单封装,可以传参 构造方法 每创建一个对象就有开辟存放方法的空间 能通过instanceof检测 ...
- (转)Struts2返回JSON对象的方法总结
转自:http://kingxss.iteye.com/blog/1622455 如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选 ...
- 【转】最实用的IT类网站及工具大集合
转自:http://www.cnblogs.com/annie00/p/5753507.html 1.聚合数据 大家在开发过程中,可能会用到各种各样的数据,想找一些接口来提供一些数据.比如天气预报查询 ...
- 学习总结 java基础
- java基础回顾(六)——WeakReference、SoftReference
在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1) ...
- Dynamics AX 4.0 多表looup
project rar:http://files.cnblogs.com/files/sxypeace/PrivateProject_MutilTableLookupOnCtronl.rar 在AX ...
- 有联系的jQuery选择器
1.包含关系 2.相邻关系 //JavaScript$(document).ready(function () { $(".studentName + div").hide(); ...
- Windows phone 8 学习笔记(3) 通信(转)
Windows phone 8 可利用的数据通信方式比较广泛,在硬件支持的前提下,我们可以利用WiFi.蓝牙.临近感应等多种方式.数据交互一般通过套接字来完成,我们将在本文详细的分析. 快速导航:一. ...