日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時(shí)間:2023/12/10 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 银行家舍入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 -0PositiveInfinityNegativeInfinity和非數(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è)doubledecimal進(jìn)行四舍五入,也可以同時(shí)對(duì)N個(gè)doubledecimal進(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。