定义一个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的“坑”的更多相关文章

  1. Sql的decimal、float、double类型的区别

    三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E ...

  2. float和double的精度

    作者: jillzhang 联系方式:jillzhang@126.com 原网址:http://blog.csdn.net/wuna66320/article/details/1691734 1 范围 ...

  3. float和double精度问题

    System.out.println(new BigDecimal(253.90).doubleValue() * 100);25390.0精度正确 System.out.println(new Bi ...

  4. float和double在内存中的存储方式

    本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgX ...

  5. float、double的有效位数

    Java中的浮点类型有两类,分别是float和double类型,其中float取_7__位有效数据,double取_15__位有效数据

  6. decimal,float和double的区别

    http://www.cnblogs.com/yellowapplemylove/archive/2011/08/23/2150316.html 一直很奇怪C#的预定义数据类型中为什么加了一个deci ...

  7. 汇编学习:float与double速度问题

    X86处理器包含两种类型的浮点数寄存器.第一种使用8个浮点寄存器组成浮点寄存器栈,另一种为向量寄存器(XMM,YMM),它们对于单双精度的处理是不同的.本文将讨论两种模式下的浮点数计算速度问题. 一. ...

  8. 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 ...

  9. float,double和decimal的精度问题

    先标注一个音标,因为我老是读错:decimal ['desɪml] 精度对比: 类型 CTS 类型 描述 有效数字 范围 float System.Single 32-bit single-preci ...

随机推荐

  1. mac下配置eclipse的hadoop环境

    下载eclipse-jee-mars-1-macosx-cocoa-x86_64.tar 右键显示包内容,将hadoop-eclipse-plugin-2.6.0.jar拷入到刚显示的包的plugin ...

  2. Reactor模式与观察者模式

    多线程编程常见模式 观察者模式: 单一的观察点,事件单一 反应器模式: 多个观察点,事件不单一(NIO里面的Selector选择器,基于Channel的事件进行多路的IO复用机制) 图-网上都是这张, ...

  3. c/c++笔记

    string 若要根据字典序比较string类型的大小,只需要用><=就可以啦 例如: string s1="abcz"; string s2="abcd&q ...

  4. BZOJ1407_NOI2002_荒岛野人_Savage_C++

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1407 题解:http://www.cnblogs.com/hadilo/p/5951091.h ...

  5. SMTP邮件发送命令

    第一步,远程登录smtp服务器 在命令行窗口输入 telnet smtp.163.com 25 然后回车第二步,用户登录 输入 helo 163.com 回车,这是向服务器表明你的用户身份250 OK ...

  6. devexpress中应用于girdviw中HtmlDataCellPrepared事件与CellEditorInitialize事件的区别

    HtmlDataCellPrepared 事件为页面展示的时候对页面做的初始化(将id变为name) ​CellEditorInitialize 事件为页面在编辑时(新增.修改)时做的初始化,如将值填 ...

  7. 再看.net本质(二)

    3.[HTTP协议]  当浏览器寻找到Web服务器的地址之后,浏览器将帮助我们把对服务器的请求转换为一系列参数发送给Web服务器.服务器收到浏览器的请求对数之后,将会分析这些数据并进行处理,然后向浏览 ...

  8. android Tab =viewpager+fragmnet

    1.定义几个fragment 的subclass 如fragmentone,fragmenttwo; public class fragmentthree extends Fragment { pri ...

  9. Leetcode027. Remove Element

    //water class Solution { public: int removeElement(vector<int>& nums, int val) { for(vecto ...

  10. VBS创建数据库

    '创建数据库'参数:strDBPath 字符串型 数据库文件的完整路径Sub CreateDataBase(strDBPath)Dim catObjSet catObj = CreateObject( ...