在工作中我发现了一个C#浮点数的精度问题,以下的程序运行结果并未得到我预期的结果:

view source

print?

01 namespace FloatTest
02
03     class Program
04     
05         static void Main(string[] args)
06         
07             double a = 0.0001;
08             float b = 0.1F;
09   
10             int c = (int)((a * 1000) / b);
11   
12             Console.WriteLine("c = {0}", c);
13   
14             Console.ReadLine();
15         
16     
17 }

我期望的结果是得到1,结果程序返回的结果为c = 0

这让我想到了可能是因为浮点数采用IEEE754的表示方法,在运算中b会转换成double,可能是在转换中算法的问题导致精度丢失,为了证实该问题,我做了下面的实验:

view source

print?

01 namespace FloatTest
02
03     class Program
04     
05         static void Main(string[] args)
06         
07             double a = 0.0001;
08             float b = 0.1F;
09   
10             int c = (int)((a * 1000) / b);
11   
12             Console.WriteLine("a = {0}", a);
13             Console.WriteLine("b = {0}", Convert.ToDouble(b));
14             Console.WriteLine("c = {0}", c);
15   
16             Console.ReadLine();
17         
18     
19 }

这次果然得到了意料中的结果:float在转成double的时候出现了精度的丢失问题

a = 0.0001
b = 0.100000001490116
c = 0

如果是在类型转换的时候导致的精度丢失,那我把b改为double应该可以解决这个问题:

view source

print?

01 namespace FloatTest
02
03     class Program
04     
05         static void Main(string[] args)
06         
07             double a = 0.0001;
08             double b = 0.1;
09   
10             int c = (int)((a * 1000) / b);
11   
12             Console.WriteLine("a = {0}", a);
13             Console.WriteLine("b = {0}", Convert.ToDouble(b));
14             Console.WriteLine("c = {0}", c);
15   
16             Console.ReadLine();
17         
18     
19 }

这次却是得到我们期望的结果:

a = 0.0001
b = 0.1
c = 1

因此,在程序中,我们应该尽量的避免浮点数类型转换导致的精度丢失。

我在GCC上做了同样的实验,结果不管哪种方式得到的结果都是正确的,我只能说可能是double Convert.ToDouble(float)的实现的原因导致的。

C#中float, double的精度问题的更多相关文章

  1. Java中float/double取值范围与精度

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...

  2. float,double等精度丢失问题 float,double内存表示

    问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 来自MSDN的解释: http://msdn.microsoft.com/zh-cn/c151dt3s. ...

  3. java中float/double浮点数的计算失精度问题(转)

    如果我们编译运行下面这个程序会看到什么? public class Test  {    public static void main(String args[]) {                ...

  4. 神奇:java中float,double,int的值比较运算

    float x = 302.01f;    System.out.println(x == 302.01); //false  System.out.println(x == 302.01f); // ...

  5. 打印出C# 中float ,double 在内存中的存放形式

    float floatA = 2.2f; ); ; i < ;++i ) { uint temp = 0x80000000 & (a << i); ) { Console.W ...

  6. Java 中的浮点数取精度方法

    Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...

  7. 【转】JAVA程序中Float和Double精度丢失问题

    原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽" ...

  8. Java中浮点类型的精度问题 double float

    要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法与浮点数的结构组成.因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法.比如,简单点的,float四个字 ...

  9. 精确计算java中float和double的精度

    [本文相关的代码放在github上.地址为:https://github.com/VigourJiang/StructuredFloat] Java中double类型的格式基本遵循IEEE 754标准 ...

随机推荐

  1. Gate One——用web展示Terminal(安装)

    Gate One可以用web来展示Terminal,虽然存在一些小缺陷,基本功能都还可以的,有兴趣的可以折腾一下. 安装环境: 系统:RHEL 6.1 ,系统自带python 2.6.6 下载需要安装 ...

  2. C-多个行内块布局

    1 消除间隔

  3. Cookie同域,跨域单点登录

    Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. 单点登 ...

  4. 百度的js日历

    <title>百度的Js日历,值得一看</title> <style> body,td,.p1,.p2,.i{font-family:arial} body{mar ...

  5. SQL升级Oracle挖的Null坑,你懂的!

    最近公司做系统数据库升级,主要由原来的SQL数据库升级Oracle数据库,对于拥有千万级数据库的实用系统来说,迁移不是件容易的时,光数据同步就需要很久,更别说要修改升级原来的SQL库使用的存储过程和视 ...

  6. 学习flex布局(弹性布局)

    Flex是Flexible Box的缩写,意为弹性布局.是W3C早期提出的一个新的布局方案.可以便捷的实现页面布局,目前较高版本的主流浏览器都能兼容,兼容情况如下: Flex在移动端开发上已是主流,比 ...

  7. C++每次读取一行字符串输入(学习笔记) (转)

    1. 面向行的输入:getline()getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾. cin.getline(Arr, 20) // Arr为用来输入行的数组的名称:   ...

  8. JFinal快速上手及注意事项

    官方手册虽然写的很详细但是忽略的很多小的细节方面,不看源码,网络资料又少,很多新手找不到解决办法.所以养成出了问题,多看源码的习惯 部署helloJFinal 项目结构 - 相关代码 `package ...

  9. 【SQL注入】mysql中information_schema详解

    在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问 ...

  10. 使用PHPExcel-1.8实现导入

    //使用PHPExcel-1.8实现导入(下载PHPExcel-1.8):导入excel 后缀名必须是.xls1.<form method="post" action=&qu ...