银行家舍入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,一经查实,立即删除!

相关文章

基础回顾之泛型

1.泛型的优点 1>提高了安全性(将运行期的错误提前到编译器) 2>省去了强转的麻烦 2.<>中只能存放引用数据类型 3.集合前后泛型需要一致,jdk1.7之后,后面的<>中可以不写 4.方法的泛型最好和类的泛型一致 5.方法的泛型若与类的泛型不一致必须在方法前声明自己的…

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

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

2017.8.23创业项目方向

新型外包服务 除甲醛 催乳师 转载于:https://www.cnblogs.com/wpxuexi/p/7420425.html

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

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

表驱动法——直接访问表示例1

表驱动法——直接访问表示例1 《代码大全》看到“表驱动法”一章&#xff0c;以下是表驱动法的第一个方法——直接访问表 import java.util.Scanner; import java.util.Calendar;class DaysPerMonth {public static void main(String[] args) {System.out.println("输入年…

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

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

模态框里使IMG的Src能动态显示

<IMG οnclick"var actionMath.random();this.srcvcode.aspx?actionaction.toString();" />点击图片&#xff0c;只要vcode.aspx能动态输出不同的内容&#xff0c;则IMG控件里的图片也会变动&#xff0c;在模态框里也有效

github和gitlab仓库一起使用

github是网络公有代码仓库&#xff0c;一般用于私人代码托管&#xff0c;而gitlab一般是企业搭建的内部代码仓库。工作期间&#xff0c;我们都会同时用到这两个仓库。可公司邮箱与个人邮箱是不同的&#xff0c;由此产生的 SSH key 也是不同的&#xff0c;这就造成了冲突 。如何…

linux端口被攻击,Linux 常见攻击端口封杀表

Linux常见攻击端口封杀表# Vi /etc/sysconfig/iptables# INPUT-A INPUT -p tcp --dport 135 -j REJECT-A INPUT -p udp --dport 135 -j REJECT-A INPUT -p tcp --dport 136 -j REJECT-A INPUT -p udp --dport 136 -j REJECT-A INPUT -p tcp --dport 137 -j REJECT-A INPUT -p u…

Exchange 2007服务器启动后,Information Store和System Attendant服务不能自动启动

Exchange 2007服务器启动后&#xff0c;Information Store和System Attendant服务不能自动启动 SA和Information服务不会自动启动&#xff0c;手动启动正常1) 在Exchange服务器上添加下面的注册表键值来延迟SA的启动时间HKLM\System\CurrentControlSet\Services\MSExchangeSA\P…

报表简介

帆软报表、华企报表、润乾报表系统、杰表 、数巨报表 1.帆软报表&#xff08;FineReport&#xff09;软件下载地址&#xff1a;http://www.finereport.com/products/trial软件介绍FineReport报表软件是帆软软件&#xff08;中国&#xff09;公司自主研发的一款纯Java编写的企业…

巨型帧linux检测,linux – KVM来宾和主机之间的巨型帧?

我正在尝试为KVM来宾和主机系统之间的存储通信实现9000字节MTU.主机有一个桥接器(br1),其MTU为9000字节&#xff1a;host# ip link show br18: br1: mtu 9000 qdisc noqueue state UPlink/ether fe:54:00:50:f3:55 brd ff:ff:ff:ff:ff:ffinet 172.16.64.1/24 brd 172.16.64.255…

访问服务器端数据

有时你要连接的服务并非是SOAP风格的。其他常用的框架可以结合使用HTTP Get和Post方法来返回数据。使用<mx:HTTPService>标签可以让你访问这种类型的WEB服务。使用HTTP Post和Get方法操作的WEB服务可以理解为REST服务。在很多情况下&#xff0c;使用HTTP Post方法。使用H…

《大话设计模式》--模板模式

题目&#xff1a;相同的两份试卷&#xff0c;甲乙两个人做&#xff0c;答案不同 public class TestPager {public void question() {System.out.println("题目&#xff1a;答案是A、B、C、D中哪一个&#xff1f;");System.out.println("答案&#xff1a;" …