银行家舍入VS四舍五入(下):.NET发现之旅(四)
生活随笔
收集整理的這篇文章主要介紹了
银行家舍入VS四舍五入(下):.NET发现之旅(四)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
接上節(jié) 這一節(jié)繼續(xù)討論銀行家舍入和四舍五入 三,自己動(dòng)手開(kāi)發(fā)四舍五入組件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
?
事實(shí)上四舍五入在很多項(xiàng)目中還經(jīng)常使用,所以我們可以動(dòng)手開(kāi)發(fā)一個(gè)這樣的組件,以后可以在多個(gè)項(xiàng)目中重用。 在開(kāi)發(fā)四舍五入組件之前,先要搞明白doulbe類(lèi)型和decimal類(lèi)型的精度問(wèn)題,這也是很多學(xué)員迷糊的地方。 根據(jù)double類(lèi)型和decimal類(lèi)型表示的最大值和最小值的區(qū)間,我們會(huì)發(fā)現(xiàn)double類(lèi)型的值最多能顯示出15個(gè)有意義的數(shù)字(不包裹小數(shù)點(diǎn)),而decimal類(lèi)型的值最多能顯示出來(lái)29個(gè)有意義的數(shù)字(不包裹小數(shù)點(diǎn)),從這里也能看出為什么decimal類(lèi)型又成為貨幣類(lèi)型,因?yàn)樗銐蚓_。如果double類(lèi)型的值超過(guò)15個(gè)數(shù)字,就會(huì)截?cái)?#xff0c;同樣如果deciaml類(lèi)型的值如果超過(guò)29個(gè)數(shù)字,就會(huì)截?cái)唷5財(cái)嗟臅r(shí)候會(huì)四舍五入。例如:?
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輸出時(shí)最多有15個(gè)數(shù)字。 Console.WriteLine(MyDouble2);//double輸出時(shí)最多有15個(gè)數(shù)字。 Console.WriteLine(MyDecimal1);//decimal輸出時(shí)最多有29個(gè)數(shù)字。 Console.WriteLine(MyDecimal2);//decimal輸出時(shí)最多有29個(gè)數(shù)字。 Console.WriteLine();?
同樣采用生成格式的辦法來(lái)輸出double類(lèi)型和deciaml類(lèi)型也會(huì)截?cái)?/span>,但是根據(jù)格式的長(zhǎng)度,會(huì)面會(huì)自動(dòng)補(bǔ)零。例如: double i = -12345.67897456345; Console.WriteLine(string.Format("{0:f" + 99 + "}", i));//大于等于100時(shí)出錯(cuò) decimal j = -12345.67897456345m; Console.WriteLine("{0:f" + 99 + "}", j);//大于等于100時(shí)出錯(cuò) Console.WriteLine();?
上面這個(gè)兩段代碼的打印結(jié)果如下圖 那么為什么最長(zhǎng)是15個(gè)數(shù)字和29個(gè)數(shù)字呢? 因?yàn)?/span>Double 值類(lèi)型表示一個(gè)值介于 -1.79769313486232e308 和 +1.79769313486232e308 之間的雙精度 64 位數(shù)字,以及 +0 或-0、PositiveInfinity、NegativeInfinity和非數(shù)字(NaN)。如果你耐住性子數(shù)數(shù)最小值和最大值的位數(shù),你發(fā)現(xiàn)時(shí)15個(gè)數(shù)字。而Decimal 值類(lèi)型表示從正 79,228,162,514,264,337,593,543,950,335 到負(fù) 79,228,162,514,264,337,593,543,950,335 之間的十進(jìn)制數(shù)。Decimal 值類(lèi)型適用于要求使用大量有效的整數(shù)及小數(shù)位數(shù)并且沒(méi)有舍入錯(cuò)誤的財(cái)務(wù)計(jì)算。同樣,如果你耐住性子數(shù)數(shù)最小值和最大值的位數(shù),你發(fā)現(xiàn)是29個(gè)數(shù)字。 這個(gè)組件的思想是利用Truncate方法和數(shù)學(xué)計(jì)算開(kāi)發(fā)的,當(dāng)然也可以利用封裝Round方法開(kāi)發(fā)。因?yàn)檫@個(gè)組件是以前我在項(xiàng)目中用的,所以就沒(méi)采用Round方法。 源代碼下載和dll下載在后面。這個(gè)組件可以對(duì)單個(gè)double和decimal進(jìn)行四舍五入,也可以同時(shí)對(duì)N個(gè)double和decimal進(jìn)行四舍五入,保留小數(shù)點(diǎn)后面多少位沒(méi)有限制,但是必須要明白,double不能超過(guò)15個(gè)數(shù)字和decimal不能超過(guò)29數(shù)字的本質(zhì)。類(lèi)關(guān)系圖如下圖 最后PS:目前銀行家算法已經(jīng)寫(xiě)入小學(xué)的教科書(shū),不懂的可以向小學(xué)生請(qǐng)教!呵呵總結(jié)
以上是生活随笔為你收集整理的银行家舍入VS四舍五入(下):.NET发现之旅(四)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何配置一个最基本的web富文本编辑器?
- 下一篇: ASP.NET MVC 1.0 + sp