接上節
這一節繼續讨論銀行家舍入和四舍五入
<b>三,自己動手開發四舍五入元件</b>
事實上四舍五入在很多項目中還經常使用,是以我們可以動手開發一個這樣的元件,以後可以在多個項目中重用。
在開發四舍五入元件之前,先要搞明白doulbe類型和decimal類型的精度問題,這也是很多學員迷糊的地方。
根據double類型和decimal類型表示的最大值和最小值的區間,我們會發現double類型的值最多能顯示出15個有意義的數字(不包裹小數點),而decimal類型的值最多能顯示出來29個有意義的數字(不包裹小數點),從這裡也能看出為什麼decimal類型又成為貨币類型,因為它足夠精确。如果double類型的值超過15個數字,就會截斷,同樣如果deciaml類型的值如果超過29個數字,就會截斷。但截斷的時候會四舍五入。例如:
double MyDouble1 = 123456789.34654654101104153453413212;
double MyDouble2 = 1234567890.34654654101104153453413212;
decimal MyDecimal1 = 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時出錯
上面這個兩段代碼的列印結果如下圖
那麼為什麼最長是15個數字和29個數字呢?
因為Double 值類型表示一個值介于 -1.79769313486232e308 和 +1.79769313486232e308 之間的雙精度 64 位數字,以及 +0 或-0、PositiveInfinity、NegativeInfinity和非數字(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下載下傳在後面。這個元件可以對單個double和decimal進行四舍五入,也可以同時對N個double和decimal進行四舍五入,保留小數點後面多少位沒有限制,但是必須要明白,double不能超過15個數字和decimal不能超過29數字的本質。類關系圖如下圖
最後PS:目前銀行家算法已經寫入國小的教科書,不懂的可以向國小生請教!呵呵
<a href="http://down.51cto.com/data/2352523" target="_blank">附件:http://down.51cto.com/data/2352523</a>
本文轉自terryli51CTO部落格,原文連結: http://blog.51cto.com/terryli/154848,如需轉載請自行聯系原作者