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 ...
随机推荐
- 如何下载spring-framework
http://jingyan.baidu.com/album/a65957f49670ac24e67f9b85.html?picindex=1
- EntityFramework 4使用存储过程分页
CREATE PROC usp_OrgPage_SQL @pageIndex INT, @pageSize INT, @totalCount INT OUTPUT AS BEGIN SET @tota ...
- 翻译:Knockout 快速上手 - 5: 你需要知道的顶级特性 续
Utilities Knockout 提供了许多可以你开发中使用的工具,你可以在 ko.utils 命名空间中找到它们,我最喜欢的工具如下所示: extend: 这个方法将两个对象合并在一起,调用这个 ...
- GitHub指南
1.创建新仓库 #创建新文件夹,打开,然后执行 git init #以创建新的 git 仓库. 2.检出仓库 #执行如下命令以创建一个本地仓库的克隆版本: git clone /path/to/rep ...
- HTTP权威指南----缓存
缓存的处理步骤: 1.接收----缓存从网络中读取抵达的请求报文2.解析----缓存对报文进行解析,提取出URL和各种首部3.查询----缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保 ...
- 关于conversation generation的论文笔记
对话模型此前的研究大致有三个方向:基于规则.基于信息检索.基于机器翻译.基于规则的对话系统,顾名思义,依赖于人们周密设计的规则,对话内容限制在特定领域下,实际应用如智能客服,智能场馆预定系统.基于信息 ...
- 华为OJ平台——首次不重复字符
题目描述: 输入一个字符串,输出字符串中第一个没有重复的字符,若没有满足条件的字符存在,则输出“.” 思路: 这题很简单,直接逐次比较就好了,但是没有考虑到更好效率的方法,以后想到的话再加上来 imp ...
- eclipse+maven+jetty环境下修改了文件需要重启才能修改成功
遇到这种情况,需要在类库文件夹中修改配置文件(C:\.m2\repository\org\mortbay\jetty\jetty\6.1.22) 在以上路径下添加如下路径的压缩文件中的两个文件即可 路 ...
- MULTIBYTETOWIDECHAR的与WIDECHARTOMULTIBYTE的参数详解及相互转换
第一个就是宽字符到多字节字符转换函数,函数原型如下: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideChar ...
- Visual C++ 开发心得与调试技巧
自己平时收集的一些技巧与心得,这里分享出来,普及一下知识. 1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Releas ...