我们先看一段代码,可以在控制台程序中执行看看结果  

    {
double d = 500;
double d1 = 233.84;
double d2 = d - d1;
//d2=266.15999999999997
}
{
double d = 0.4;
double d1 = d + d + d;
//d1=1.2000000000000002
double d2 = d * 3;
//d2=1.2000000000000002
}
{
double d = 1.2;
double d1 = d / 0.4;
//d1=2.9999999999999996
}

  看到结果,你可能惊讶或者不惊讶,认为计算机计算出现这种精度问题很正常,但是当你做判断时,发现1.2!=0.4*3或者3!=1.2/0.4,你就会懵逼了  

    bool b1 = 1.2 == 0.4 * 3;//false
bool b2 = 3 == 1.2 / 0.4;//false

  更有甚者,将计算出来的double类型直接保存在数据库,那保存的也是上面那一堆的小数,后来者看到这个也是奔溃的!

  

  更大的影响是在做金额运算时,我们一般都是精确到分,但是有时会计会发现自己计算出来的数据和我们系统中的对不上,我们的第一感觉也是精度问题,往往会做一个四舍五入,向上取值,向下取值等等操作,那么更大的问题来了,比如向下取值,你会发现1.2/0.4向下取整等于2!  

    double b = Math.Floor(1.2 / 0.4);//b=2

  心中一万只草泥马奔腾而过!

  float、double和decimal

  float、double和decimal是C#中表示浮点数的类型

类型 名称 bit 有效数字 数值范围 是否基础类型
float 单精度浮点数 32 7 ±1.5×10E−45 ~ ±3.4×10E38
double 双精度浮点数 64 15/16 ±5.0×10E−324 ~ ±1.7×10E308
decimal 高精度浮点数 128 28 ±1.0×10E−28 ~ ±7.9×10E28

  float和double都是基础类型,区别就是表示的数值范围和精度不一样,而decimal是C#作为补充加上来的一个类型,不是基础类型,它拥有更高的精度,但是表示的数值范围却小多了,而且计算速度相对来说要慢一些,但是也足够一般的业务需求了,比如上面的例子,如果把double都换成decimal就不会出现问题了。

  float、double和decimal都有精度丢失问题,只不过他们在丢失时的精度条件不一样,而且精度丢失了还不报异常。

  个人建议

  1、在项目中尽可能的使用decimal,虽然decimal也会出现精度丢失问题,但是一般业务需求是没问题的。

  2、当方法返回浮点类型时,或者返回的实体包含有浮点类型,那么在返回时一定要考虑要不要处理精度问题。

  3、在对外输出或者存储时,如保存到数据库,一定要根据自己的需求做个精度处理。

  4、当基础类型在不同类型之间转换时,尽可能的使用Convert类中的方法,少用强制转换。 

  5、尽量避免使用浮点数做比较,如果愣是比较,可以先做精度处理或者先转换成整型再比较。

C# double类型精度丢失问题的更多相关文章

  1. Java:利用BigDecimal类巧妙处理Double类型精度丢失

    目录 本篇要点 经典问题:浮点数精度丢失 十进制整数如何转化为二进制整数? 十进制小数如何转化为二进制数? 如何用BigDecimal解决double精度问题? new BigDecimal(doub ...

  2. Java-从Double类型精度丢失认识BigDecimal

    Java-从Double类型精度丢失认识BigDecimal 参考资料 https://www.jianshu.com/p/07e3eeb90f18 https://zh.wikipedia.org/ ...

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

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

  4. double发生精度丢失的解决办法

    发生精度丢失的原因: 个人理解:机器在运行时,使用2进制形式的计数方式,而我们日常生活中的计算是10进制的,对于整数的加减乘除,double还能适用,但是对于有小数的,则容易发生精度丢失,即用2进制表 ...

  5. Java-Long类型精度丢失问题

    问题 今天碰到一个问题,后端需要返回给前端Long类型的id,前端收到的id会发生精度丢失. 测试代码:后端返回的值为344739147160346624 但是前端获取的值为: 解决办法 将返回的值转 ...

  6. Spring Mvc Long类型精度丢失

    背景 在使用Spring Boot Mvc的项目中,使用Long类型作为id的类型,但是当前端使用Number类型接收Long类型数据时,由于前端精度问题,会导致Long类型数据转换为Number类型 ...

  7. JS处理Long类型精度丢失问题

    解决方式一 json注解 public class ProductVo {​   @JsonSerialize(using=ToStringSerializer.class)   private Lo ...

  8. java下double相乘精度丢失问题

    比如 System.out.println(0.14*100); 输出: 14.000000000000002 解决方法: BigDecimal b = new BigDecimal(String.v ...

  9. [ JAVA编程 ] double类型计算精度丢失问题及解决方法

    前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...

随机推荐

  1. 【编程思想】【设计模式】【行为模式Behavioral】模板模式Template

    Python转载版 https://github.com/faif/python-patterns/blob/master/behavioral/template.py #!/usr/bin/env ...

  2. matplotlib subplot 多图合一

    1:第一种方法 # method1: subplot2grid ################# ''' 第一个参数(3, 3) 是把图分成3行3列 第二个参数是位置 (0, 0)表示从0行0列开始 ...

  3. 『与善仁』Appium基础 — 20、Appium元素定位

    目录 1.by_id定位 2.by_name定位 3.by_class_name定位 4.by_xpath定位 5.by_accessibility_id定位 6.by_android_uiautom ...

  4. IT过来人的10点经验谈

    1 入行要趁早,正常是22岁本科或25岁硕士毕业入行.如果是零基础经培训班加持的,尽量在28岁前入行,30岁以后再想要入行IT的,千万慎重. 2 IT行业确实能挣大钱,而且能为学历一般学校一般家庭背景 ...

  5. Mysql配置文件 基本设置

    [mysqld] #MySQL启动用户 user = mysql #设置mysql的安装目录 basedir=/usr/local/mysql #mysql.sock存放目录 socket=/var/ ...

  6. 服务器安装Centos7

    目录 一.安装 一.安装 1.开启虚拟机后会出现以下界面 Install CentOS 7 安装CentOS 7 Test this media & install CentOS 7 测试安装 ...

  7. c++和c中const的区别

    const在c与c++的区别与使用 大学期间对c和c++的了解太少了,现在工作了导致自己来恶补,简单的const关键字里面的学问还是挺大的,越是基础的知识越是容易忘却,所以今天开始记录着自己每一天的学 ...

  8. Table.FirstN保留前面N….First…(Power Query 之 M 语言)

    数据源: "姓名""基数""个人比例""个人缴纳""公司比例""公司缴纳"&qu ...

  9. SpringBoot整合quartz实现动态启动,停止定时任务功能

    注意:这个方法当程序重启之后会失效,所以必须将定时任务持久化到数据库,然后程序启动的时候重新把数据库的定时任务加载到quartz中 springboot程序启动初始化代码参考:https://www. ...

  10. 使用.NET 6开发TodoList应用(8)——实现全局异常处理

    系列导航 使用.NET 6开发TodoList应用文章索引 需求 因为在项目中,会有各种各样的领域异常或系统异常被抛出来,那么在Controller里就需要进行完整的try-catch捕获,并根据是否 ...