一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖。

浮点型

Name

CTS Type

De script ion

Significant Figures

Range (approximate)

float

System.Single

32-bit single-precision floating point

7

±1.5 × 10?45 to ±3.4 × 1038

double

System.Double

64-bit double-precision floating point

15/16

±5.0 × 10 ?324 to ±1.7 × 10308

如果我们在代码中写一个12.3,编译器会自动认为这个数是个double型。所以如果我们想指定12.3为float类型,那么你必须在数字后面加上F/f:

float f = 12.3F;

decimal类型

作为补充,decimal类型用来表示高精度的浮点数

Name

CTS Type

De script ion

Significant Figures

Range (approximate)

decimal

System.Decimal

128-bit high precision decimal notation

28

±1.0 × 10?28 to ±7.9 × 1028

从上表可以看出,decimal的有效位数很大,达到了28位,但是表示的数据范围却比float和double类型小。decimal类型并不是C#中的基础类型,所以使用的时候会对计算时的性能有影响。

我们可以像如下的方式定义一个decimal类型的浮点数:

decimal d = 12.30M;

对decimal、float、double错误的认识

在精确计算中使用浮点数是非常危险的,尽管C#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,将造成非常严重的隐患。

考虑下面的语句:

double   dd   =   10000000000000000000000d;

dd   +=   1;

Console.WriteLine   (   "{0:G50}",   dd   );

输出是什么?谁知道?

输出是:1000000000000000000000000

这就是浮点数精度损失的问题,最重要的是,在精度损失的时候,不会报告任何的错误,也不会有任何的异常产生。

浮点数的精度损失可能在很多地方出现,例如d   *   g   /   g   不一定等于d,d   /   g   *   g也不一定等于d。

还有两个非常危险的错误认识!!

1、decimal不是浮点型、decimal不存在精度损失。

下面有段程序大家可以去看看结果是什么。记住!所有的浮点型变量都存在精度损失的问题,而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!

decimal   dd   =   10000000000000000000000000000m;

dd   +=   0.1m;

Console.WriteLine   (   "{0:G50}",   dd   );

2、decimal所能储存的数比double大,从double到decimal的类型转换不会出现任何问题。

微软在decimal的帮助上真的要好好反省了。实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。

“decimal   类型是适合财务和货币计算的   128   位数据类型。”

当然,decimal在大多数情况下是安全的,但浮点数在理论上是不安全的。

至于精度误差造成的显示问题,则是很容易修补的。浮点数会带来的问题以及整型能避免的问题就是一个:

譬如说从A帐户转账到B帐户,经计算得出结果是3.788888888888888元,那么我们从A帐户扣除这么多钱,B帐户增加这么多钱,但事实上A帐户不一定会扣除准确的数值,例如A帐户的金额在100000000000,那么这个时候100000000000   -   3.788888888888888运算结果很有可能是99999999996.211111111111112。而这个时候B帐户的金额为0则很有可能加上准确的数值,如3.788888888888888,这样一来,0.011111111111112元钱就会不见了,日积月累的,差额就会越来越大。

double是64位的,比single-32位精度高

decimal128位高精度浮点数,常用于金融运算,不会出现浮点数计算的误差

,decimal   类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。

早上刚到办公室,就被中试室打来电话叫去,原来软件在测试过程中发现了个小问题:软件读出来的数据比设备LCD上显示数据小了 0.01 。

怎么会这样呢,数据类型我已经用了 double 型了整个数据长度也就6位,double型的数据有效数据位为7位,也够了阿,不明白。于是回来下断点跟踪。

前面double型在算的时候,是没问题的,数据是66.24,可是当我把66.24 乘上100后的处理结果就不对了:66.24*100.0d = 6623.9999…91,问题就出在这里了。查了msdn,Double型的数据:Double 值类型表示一个值介于 -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字,浮点数只能近似于十进制数字,浮点数的精度决定了浮点数近似于十进制数字的精确程度。默认情况下,Double 值的精度是 15 个十进制位,但内部维护的最大精度是 17 位。所以就出现了乘上一百后,精度就不够了。又由于我们在处理数据时,是不允许四舍五入的,所以,经过单位转换后,软件中最终显示的数据为 66.23 ,比LCD上显示的66.24 小了 0.01。

因此,这之后就想到了应该用更高精度的 decimal 型。

类型

大致范围

精度

.NET Framework 类型

decimal

±1.0 × 10e?28 至 ±7.9 × 10e28

28 到 29 位有效位

System.Decimal

s在声明decimal类型数据时,可以 a: decimal myData = 100,此时编译器隐式转换整型数100为 100.0m;当然也可以b: decimal myData = 100.0m,但是 如果是 decimal myData = 100.0d或者decimal myData = 100.0f,就不行了,因为100.0d或者100.0f,编译器认为是浮点数,而浮点数和decimal 类型之间不存在隐式转换;因此,必须使用强制转换在这两种类型之间进行转换。This is the important,否则编译器便报错。所以一般的财务软件在处理时,都会用decimal 类型。

好了,改用decimal 型之后,就OK 了,结果就完完整整地显示为 66.24 了。

源自http://lj.soft.blog.163.com/blog/static/79402481201032210173381/

转载于:https://www.cnblogs.com/Nina-piaoye/archive/2013/05/31/3110184.html

decimal,float和double的区别相关推荐

  1. float和double的区别

    float和double的区别 两者的主要区别如下: 1.在内存中占有的字节数不同 单精度浮点数在机内存占4个字节 双精度浮点数在机内存占8个字节 2.有效数字位数不同 单精度浮点数有效数字8位 双精 ...

  2. JAVA中的float和double的区别

    1.两个在定义时的区别 1)float型 内存分配4个字节,占32位,范围从10^-38到10^38 和 -10^38到-10^-38         例float x=123.456f,y=2e20 ...

  3. 详细讲解int、float与double的区别

    最近为了看一下float的精确度仔细看了一下这三种数据在内存中的样子,看了一下别人的博客发现大家对精度都有这不同的定义,我自己也简单画了一下. 下面来主要讲解一下int.float与double三者的 ...

  4. float与double类型区别比较

    参考或转自http://topic.csdn.net/u/20090716/10/CE4A7037-3C0D-40AE-AF85-F702C78FCEA3.html 单精度浮点数在机内占4个字节,用3 ...

  5. 细节:基本数据类型中float与double的区别

    一.两者定义 float:单精度浮点数 double:双精度浮点数 二.两者的主要区别 01)在内存中占有的字节数不同 单精度浮点数在机内存占4个字节 双精度浮点数在机内存占8个字节 02)有效数字位 ...

  6. float 与 double 的区别

    1. 范围 float和double的范e79fa5e9819331333366303137围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float ...

  7. 浮点数float和double的区别

    一.float的指数位有8位,而double的指数位有11位,分布如下: float:1bit(符号位) 8bits(指数位) 23bits(尾数位) double:1bit(符号位) 11bits( ...

  8. float、double(浮点数)区别还有和decimal(定点数)的比较

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

  9. float与double类型参数区别_8大基本数据类型及包装类,不知道这些点别说自己是大佬...

    一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等.然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形.为了解决这个问题 ...

最新文章

  1. redis 数据结构 内存管理 持久化
  2. 如何用体验赢取用户信任?让 Waymo 来教教你
  3. 提高显微镜分辨率方法_超分辨显微镜研究获进展
  4. 量化评估推荐系统效果
  5. Python稳基修炼之计算机等级考试易错概念题6(含答案)
  6. java 运行时修改类_在运行时修改类定义的注释字符串参数
  7. 2个版本并存的python使用新的版本安装django的方法
  8. Spring Cloud消息驱动整合
  9. quartz mysql 配置_Quartz框架(一)—Quartz的基本配置
  10. 3.7V和7.4V输入升压输出12V1A外围简单,8.4V升压12V1A芯片方案
  11. vue里面实现百度地图 标记多点 地点连线
  12. Spring AOP实现原理简介
  13. 电脑只能上微信不能打开网页_能上微信不能打开网页
  14. android 按钮边距,安卓button代码初始化默认内边距问题
  15. WPF编程宝典--控件
  16. 工业界和学术界最大区别是什么?
  17. [零刻] SER5 Pro 迷你主机:从开箱到安装ESXi+虚拟机
  18. WordPress中文汉字用户名不能注册怎么办?
  19. Web全栈~31.并发
  20. 智能家居中物联网技术的应用

热门文章

  1. 待遇 新时达机器人_践行中国制造2025:工业机器人企业突围之路
  2. 分享适合程序员使用17 张壁纸
  3. Java:Lombok插件用法笔记
  4. 系统运维:收集6款经典的服务器监控工具
  5. 电脑办公人员必看:效率翻倍的11个Excel技巧!
  6. Linux系统解决网络问题的笔记
  7. 30条值得程序员借鉴的好习惯
  8. SQL Server各个版本功能比较
  9. java pdf 导出下载_Java+PDF模板导出成pdf文件,并下载
  10. java编程思想 初始化_《java编程思想》_第五章_初始化与清理