银行家舍入VS四舍五入(下):.NET发现之旅(四)

接上节
这一节继续讨论银行家舍入和四舍五入
三,自己动手开发四舍五入组件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

事实上四舍五入在很多项目中还经常使用,所以我们可以动手开发一个这样的组件,以后可以在多个项目中重用。

在开发四舍五入组件之前,先要搞明白doulbe类型和decimal类型的精度问题,这也是很多学员迷糊的地方。

根据double类型和decimal类型表示的最大值和最小值的区间,我们会发现double类型的值最多能显示出15个有意义的数字(不包裹小数点),而decimal类型的值最多能显示出来29个有意义的数字(不包裹小数点),从这里也能看出为什么decimal类型又成为货币类型,因为它足够精确。如果double类型的值超过15个数字,就会截断,同样如果deciaml类型的值如果超过29个数字,就会截断。但截断的时候会四舍五入。例如

 

double MyDouble1 = 123456789.34654654101104153453413212;

double MyDouble2 = 1234567890.34654654101104153453413212;

decimal MyDecimal1 = <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />123456789.34654654101104153453513212m;

decimal MyDecimal2 = 1234567890.34654654101104153453513212m;

Console.WriteLine(MyDouble1);//double输出时最多有15个数字。

Console.WriteLine(MyDouble2);//double输出时最多有15个数字。

Console.WriteLine(MyDecimal1);//decimal输出时最多有29个数字。

Console.WriteLine(MyDecimal2);//decimal输出时最多有29个数字。

Console.WriteLine();

 

同样采用生成格式的办法来输出double类型和deciaml类型也会截断,但是根据格式的长度,会面会自动补零。例如

double i = -12345.67897456345;

Console.WriteLine(string.Format("{0:f" + 99 + "}", i));//大于等于100时出错 decimal j = -12345.67897456345m;

Console.WriteLine("{0:f" + 99 + "}", j);//大于等于100时出错

Console.WriteLine();

 

上面这个两段代码的打印结果如下图

那么为什么最长是15个数字和29个数字呢?

因为Double 值类型表示一个值介于 -1.79769313486232e308 +1.79769313486232e308 之间的双精度 64 位数字以及 +0 -0PositiveInfinityNegativeInfinity和非数字NaN)。如果你耐住性子数数最小值和最大值的位数,你发现时15个数字。而Decimal 值类型表示从正 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 之间的十进制数。Decimal 值类型适用于要求使用大量有效的整数及小数位数并且没有舍入错误的财务计算。同样,如果你耐住性子数数最小值和最大值的位数,你发现是29个数字。

这个组件的思想是利用Truncate方法和数学计算开发的,当然也可以利用封装Round方法开发。因为这个组件是以前我在项目中用的,所以就没采用Round方法

源代码下载和dll下载在后面。这个组件可以对单个doubledecimal进行四舍五入,也可以同时对Ndoubledecimal进行四舍五入,保留小数点后面多少位没有限制,但是必须要明白,double不能超过15个数字和decimal不能超过29数字的本质。类关系图如下图

最后PS:目前银行家算法已经写入小学的教科书,不懂的可以向小学生请教!呵呵

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

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

相关文章

linux dd安装系统,通过DD命令安装Windows,并介绍几款DD镜像包

Loading...原则上仅适用于独立服务器&#xff0c;并未添加其他虚拟化驱动online/oneprovider/hetzner的服务器已经过测试可以正常使用首先进入服务器的救援系统进入救援系统后使用root权限输入以下命令&#xff0c;然后等待一段时间后可尝试远程连接win10LTSC&#xff1a;wget …

FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash)

FMS开发中&#xff0c;经常会使用共享对象来同步用户和存储数据。对于实现广播文字信息实现聊天的支持非常强大&#xff0c;还可以跟踪用户的时时动作&#xff0c;在开发Flash多人在线游戏中的应用也非常广阔。 在使用FMS开发共享对象时需要注意&#xff0c;只有使用Flash Medi…

linux原理 培训,Linux容器技术原理和使用

1.1 隔离和共享在一个多员共用的开发环境或者一台服务器运行多个逻辑隔离的服务器进程。谁的运行环境也不希望影响到另一个谁。也就是一个物理机器需要虚拟化出多个环境或者容器。通过提供一种创建和进入容器的方式&#xff0c;操作系统让应用程序就像在独立的机器上运行一样&a…

工业无线遥控器 SUNRF-1011RC

工业无线遥控器 SUNRF-1011RC工业无线遥控器产品 授权操作 一&#xff1a;简介&#xff1a;工业无线遥控器&#xff0c;是针对工业环境&#xff0c;专门设计的无线控制替代有线控制的方案。和有线控制一样&#xff0c;具有实时性、灵活性、多路同时操作、操作灵活顺畅无…

C语言封装带省略参数的函数,C与C++的函数声明中省略参数的不同意义

一直都以为C/C中形如int func();这样的函数声明其意义就是一个参数 void(没有参数)的函数。然而今天在看C的时候突然看到这么一句&#xff1a;对于带空参数表的函数&#xff0c;C和C有很大的不同。在C语言中&#xff0c;声明int func2();表示“一个可带任意参数(任意数目&#…

理解快速生成树协议(RSTP)(二)

RSTP引进了新的BPDU处理以及一种新的拓扑结构改变机制。即使没有从根桥处接收到任何信号&#xff0c;每个网桥在每次“hello时间周期中”中都生成BPDU。BPDU扮演了在网桥间进行消息通知的角色。如果一个网桥不能从临近网桥处收到BPDU&#xff0c;它就会认为与这个网桥失去了连接…

POJ2243 Knight Moves —— A*算法

题目链接&#xff1a;http://poj.org/problem?id2243 Knight MovesTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14500 Accepted: 8108Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the short…

mac配置telnet

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" brew install telnet

linux下的DNS服务器详解

DNS&#xff1a;Domain Name System 域名管理系统 域名是由圆点分开一串单词或缩写组成的&#xff0c;每一个域名都对应一个惟一的IP地址&#xff0c;这一命名的方法或这样管理域名的系统叫做域名管理系统。 大家都知道&#xff0c;当我们在上网的时候&#xff0c;通常输入的是…