標籤:
今天分享一個小型電商系統的資料庫價格欄位的資料類型設計。附上通用四捨五入轉換方法
我們知道,價格欄位使用的類型,最佳的有兩個,分別為:decimal,money;而money小數部分只能精確到4位,雖然money在記憶體上是比decimal少那麼一個位元組,但是現在硬碟那麼大,不用計較了。
個人喜歡,我全部直接用decimal(18,5),小數部分我直接用了5位;
但是對於一個商品來說,我最多隻會用到兩位小數,百分比也只會用到4位,5位的只能是更小的傭金比例計算。
但我覺得這樣算起來的數,小數實在是太小了,既然針對小型電商來說,我覺得只要兩位就足夠了,
所以我引入了一些概念,
1、針對提現金額的手續約不採用標準的四捨五入,保留兩位小數。
2、針對傭金提成的手續約也不採用標準的四捨五入,保留兩位小數。
3、要使用者交錢的四捨五入,只要第三位小數有值,直接往第二位進1,目的就是要使用者多交錢。
3、要商家交錢的四捨五入,不管第三位小數是否有值,都不進1,目的是要商家少交錢。
好了,有了這些基礎後,我直接整個資料庫設計儲存的價格值傭金值都採用保留兩位小數進行儲存,雖然使用decimal(18,5)會有3個多餘的0,這裡我直接用一個方法進行切割,反正是沒值的。
而對於百分比的,直接不變,都是採用五位小數。
下面我提供我換算的方法:
/// <summary> /// 四捨五入計算類 /// </summary> public class Round { /// <summary> /// 標準切割,結果保留兩位小數 /// 不計算四捨五入 /// </summary> public static decimal Standard(string money) { return decimal.Parse((Math.Truncate(double.Parse(money) * 100) / 100.00).ToString("0.00")); } /// <summary> /// 標準四捨五入,結果保留兩位小數 /// </summary> public static decimal RoundForStandard(string money) { return Standard(Math.Round(double.Parse(money), 2, MidpointRounding.AwayFromZero).ToString()); } /// <summary> /// 針對使用者的四捨五入,結果保留兩位小數 /// 要使用者交錢的四捨五入,目的就是要使用者多交錢 /// </summary> public static decimal RoundForUser(string money) { if ((double.Parse(money)*100) > ((int) (double.Parse(money)*100))) //看下小數點第三位是否有數 { //有的時候,直接進1 return Standard((double.Parse(money) + 0.01).ToString()); } else { return Standard(money); } } /// <summary> /// 針對商家的四捨五入,結果保留兩位小數 /// 要商家交錢的四捨五入,目的是要商家少交錢 /// </summary> public static decimal RoundForMerchant(string money) { return Standard(money); } /// <summary> /// 固定點的轉換,可將小數後面多餘的零去掉 /// 這個不固定保留多少位小數 /// </summary> public static decimal Fixed(string money) { return decimal.Parse(string.Format("{0:G}", money)); } }
後話,如果我這裡有什麼是錯的,歡迎大家指正。
小型電商系統資料庫中的價格類型設計