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 ...
随机推荐
- 《Head First 设计模式》ch.2 观察者(Observer)模式
观察者模式 定义了对象之间一对多以来,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新 设计原则-松耦合 松耦合将对象之间的互相依赖降到了最低——只要他们之间的接口仍被遵守 观察者 ...
- Java中1000==1000为false而100==100为true
public static void main(String[] args) { int z1 = 0; int z2 = 0; System.out.println(z1==z2);//TRUE I ...
- java.io.Serializable浅析
转自:http://www.cnblogs.com/gw811/archive/2012/10/10/2718331.html Java API中java.io.Serializable接口源码: p ...
- 008 The Generics In JAVA
泛型是JAVA的核心特型之一,我们先看一个例子: 没有使用泛型前,如下: import java.util.ArrayList; import java.util.List; public class ...
- 使用 Sahi 实现 Web 自动化测试
Sahi 是 Tyto Software 旗下的一个基于业务的开源 Web 应用自动化测试工具.Sahi 运行为一个代理服务器,并通过注入 JavaScript 来访问 Web 页面中的元素.Sahi ...
- 腾讯校招技术岗面试经历及总结(已发offer)
关于笔试:只要前期复习到位,笔试还是很好过的,但是当然 分数 越高越好,否则后面会被面试官鄙视的.题目可能难度较大,但是要把会做的 都做 对,如果时间比较紧可以适度放弃部分不会的题目. 关于面试: 温 ...
- iScroll相关
iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. iScroll的最新版本是2011.07.03发布的4.1.7版.最新版比以 ...
- 云计算三种服务模式SaaS、PaaS和IaaS及其之间关系(顺带CaaS、MaaS)
云计算架构图 很明显,这五者之间主要的区别在于第一个单词,而aaS都是as-a-service(即服务)的意思,这五个模式都是近年来兴起的,且这五者都是云计算的落地产品,所以我们先来了解一下云计算是什 ...
- 利用KeyVault来加强存储Azure Storage访问密钥管理
很多时候管理Azure的存储账号我们都需要通过下面的界面管理访问密钥,大部分情况下通过密钥的轮替使用更新就可以做到安全管理了. 但是很多时候存储账号的Key就会不小心分发到开人员.测试人员.和管理员手 ...
- VS2013 当前不会命中断点还未为文档加载任何符号
情况:在别人那边的项目可以调试,在我这边不行.看来是电脑环境问题了 自己试过 VS2013修复下(用了1个半小时),点评:无效 网上 五花八门的都不适合 1.设置与当前版本不一致取消打勾. 点评 ...