decimal,float和double的区别

一直很奇怪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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之调用微信登陆、分享、支付

转载:http://blog.csdn.net/lowprofile_coding/article/details/48086381 前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到…

两年发表14篇论文,其中10篇一作,这是她的科研进阶攻略

全世界只有3.14 % 的人关注了爆炸吧知识本文来源:浙江大学两年发表14篇论文,其中一作10篇,包括4篇Top SCI,2篇SCI和4篇EI;持有2项发明专利,出版1部英文专著,斩获2020年度学生学术十大新成果奖第…

生活在任务栏的猫, CPU使用率越高它就跑的越快

生活在任务栏的猫, CPU使用率越高它就跑的越快Runcat 是一个桌面软件, 这只猫会显示在您的任务栏上面, 它会一直奔跑, 它的运行速度取决于CPU的使用率, 支持 Windows 和 Mac 平台。您还可以用它查看系统资源使用率, 包括CPU使用率,内存,电池状态,网络传输速度等。如果这只猫一直…

在Ant的javac中指定源文件编码方式,以避免警告: 编码 GBK 的不可映射字符的错误...

为什么80%的码农都做不了架构师&#xff1f;>>> * 该错误会造成源文件中的字符串出现混乱&#xff0c;从而影响indexOf()之类函数的正常功能&#xff0e; <javac srcdir"${common.src.dir}" destdir"${build.temp.common.classes.dir}" de…

Oracle命令--alter 操作

1 alter database&#xff1a;修改数据文件 alter database datafile 4 offline; alter database datafile /opt/oracle/datafile/users01.dbf offline; alter database datafile /opt/oracle/datafile/users01.dbf resize 100M; alter database datafile /opt/oracle/datafile…

java 正则匹配引号_java 正则 贪婪匹配 匹配sql语句中的引号内容

public class Demo {public static void main(String[] args) {String sql1 "use test;select * from default.abc where dtabc;faf;fff and ct\"2012;43\" ; ";sql1 "select * from aaa where dt 20 ;12; 34;3 AND namefafae; fa ; a";//配置…

现在要吃软饭的,都这么明目张胆了吗?

1 加我一个&#xff1f;▼2 为什么电梯里会有两只光着的右脚&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼这样&#xff1f;3 老爹的脸更黑了▼4 但也不影响吧&#xff1f;都不及格▼5 妈&#xff0c;你说的一点都没错&#xff01;&#xff08;素材来源网络&…

Android之app引导页(背景图片切换加各个页面动画效果)

转载&#xff1a;http://blog.csdn.net/lowprofile_coding/article/details/48037095 先看效果图: 1.显示三个页面的Activity 用view pager去加载三个fragment实现,控制点点点的切换,监听view pager的切换,控制fragment动画的开始跟结束,重写了view pager,实现了背景图片的移…

VSCode SSH 连接提示: spawn UNKNOWN

随笔记录 目录 1. 背景介绍 2. 确认问题 : ssh -V 3. 解决问题 3.1 确认本地 ssh.exe 路径 3.2 修改vscode Remote.ssh:Path 3.2.1 设置 Reomte.ssh:Path - 方法一 3.2.2 设置 Reomte.ssh:Path - 方法二 1. 背景介绍 windows 系统vscode ssh remote CentOS7&#xff…

手把手教你学Dapr - 9. 可观测性

介绍通过Tracing(跟踪)、Metrics(指标)、Logs(日志)和Health(运行状况)监控应用程序。分布式跟踪Dapr 使用 Zipkin 协议进行分布式跟踪 和 Metrics 收集。由于 Zipkin 协议的普遍性&#xff0c;许多后端都是开箱即用的&#xff0c;例如 Stackdriver、Zipkin、New Relic 等。结合…

Tumblr技术架构

近日&#xff0c;著名博客社区Tumblr被Yahoo用11亿美金收购。为什么Yahoo对Tumblr如此看重&#xff0c;下面是Tumblr的技术架构介绍。 本打算自己翻译一下&#xff0c;但发现已经有人这么做了&#xff0c;就直接转载好了 最近的新闻中我们得知雅虎11亿美元收购了Tumblr: Yaho…

ip_vs实现分析(2)

本文档的Copyleft归yfydz所有&#xff0c;使用GPL发布&#xff0c;可以自由拷贝&#xff0c;转载&#xff0c;转载时请保持文档的完整性&#xff0c;严禁用于任何商业用途。msn: yfydz_no1hotmail.com来源&#xff1a;http://yfydz.cublog.cn 4. 模块初始化初始化函数先初始化i…

这些魔术用的是物理原理?有啥诀窍?

全世界只有3.14 % 的人关注了爆炸吧知识许多成功的魔术&#xff0c;都运用了物理知识。我们在观看魔术表演时&#xff0c;也可以学到相当多的知识&#xff0c;有时用一般的原理就可以表演一个十分精彩的魔术。所以我们希望揭开魔术的神秘面纱&#xff0c;探究其中的物理知识。一…

二分查找找下标或者值

public class Util { //求最大值public static int maxValue(int a,int b){int max=0;if(a>b){max=a;}else{max=b;}return max;}//求最小值public static int minValue(int a,int b){int min=0;if(a>b){min=b;}else{min=a;}return min;}//选择排序public static int[] se…

安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法

可能有的朋友在运行某软件时&#xff0c;会出现了“无法启动此程序,因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。”的提示,遇到这样的情况该怎么办呢&#xff1f;不用着急&#xff0c;下面小编就为大家带来解决方法&#xff0c;遇到同样问题却不知道如何解…

java 线程 获取消息_获取java线程中信息

怎样获取java线程中信息&#xff1f;在进行多线程编程中&#xff0c;比较重要也是比较困难的一个操作就是如何获取线程中的信息。大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中&#xff0c;然后再提供一个获取方法将这个字段的内容返回给该方法的…

OAuth 2.0 扩展协议之 PKCE

前言阅读本文前需要了解 OAuth 2.0 授权协议的相关内容&#xff0c; 可以参考我的上一篇文章 OAuth 2.0 的探险之旅[1]。PKCE 全称是 Proof Key for Code Exchange&#xff0c; 在2015年发布&#xff0c; 它是 OAuth 2.0 核心的一个扩展协议&#xff0c; 所以可以和现有的授权模…

欧洲杯直播助PPTV日均流量登顶视频行业首位

随着意大利溃败&#xff0c;西班牙最终捧杯&#xff0c;四年一度火爆的欧洲杯赛事也就此落下帷幕。令人欣喜的是&#xff0c;在本届欧洲杯比赛的直播过程中&#xff0c;由于比赛安排再深夜&#xff0c;互联网应用取代传统电视台成为人们观看赛事的主要渠道&#xff0c;各大视频…

深度优先算法

/*** @author Think* 给定整数a1,a2,a3,a4…,判断是否可以从中选出若干数,使他们的和恰好为K*/ public class 深度优先算法 {//n=4,a={1,2,4,7};k=13;public static int n=4;public static int [] a={1,2,4,7};public static int k=13;public static void main(String[] ar…

/etc/network/interfaces

man resolvconf man interfaceshttp://linux-net.osdl.org/index.php/Bridge示例:# This file describes the network interfaces available on your system# and how to activate them. For more information, see interfaces(5).# The loopback network interfaceauto lo ifa…