在工作中我发现了一个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. 22.Linux-块设备驱动之框架详细分析(详解)

    本节目的: 通过分析块设备驱动的框架,知道如何来写驱动 1.之前我们学的都是字符设备驱动,先来回忆一下 字符设备驱动: 当我们的应用层读写(read()/write())字符设备驱动时,是按字节/字符 ...

  2. 单独创建一个Android Test Project 时junit 的配置和使用

    现在的集成ADT后Eclipse都可以直接创建Android Test Project 如图所示: 命名后选择你要测试的单元程序,比如我自己准备测试sms,便可以如图所示那样选择 本人新建的测试工程为 ...

  3. 数据迁移过程中hive sql调优

    本文记录的是,在数据处理过程中,遇到了一个sql执行很慢,对一些大型的hive表还会出现OOM,一步一步通过参数的设置和sql优化,将其调优的过程. 先上sql ) t where t.num =1) ...

  4. Maven-环境搭建以及建立Maven项目

    Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 多的不说,直接开始这章节的主要内容. 1.maven下载地址http://maven.apac ...

  5. plsql中文乱码问题方案解决

    1.查看服务器端编码 a.select   userenv('language')  from  dual; b.我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK 2.执行语句 ...

  6. mac iterm2安装、sshpass密码记住

    1.  item2官网下载,自行安装 2. 导入以前生成的Prefiles文件到 /Users/alex/Library/Application Support/iTerm2/DynamicProfi ...

  7. asp.net mvc webapi 实用的接口加密方法

    在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性. 安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大, ...

  8. log4j2配置文件解读

    log4j2可以按照开发人员预先的设定,在指定的位置和情况下打印log语句,并且可以酌情关闭某些log语句,如开发阶段debug类型的语句等.并且,可以使用layout来定义输出语句的格式. 使用前需 ...

  9. UWP xaml 圆形头像

    圆形头像 去掉黑边 拖动打开图形 圆形头像 现在很多软件都喜欢使用圆形头像 win10 uwp使用圆形头像很简单 <Ellipse Width="200" Height=&q ...

  10. admin的基础配置

    admin自定义配置 一.admin.py 我们知道在models.py文件中创建的数据表,一方面我们可以通过视图函数对其进行增删改查,一方面我们也可以通过admin进行,通常我们是通过admin的前 ...