金額,重量,成績不使用浮點數來表示,而使用整型

2021-10-23 08:06:14 字數 760 閱讀 8144

金額、重量、成績等資料庫字段推薦使用int或bigint型別。

通常我們資料庫設計中,金額,重量等涉及到小數字的字段會用float或decimal,mysql還可以用double,但往往每筆金額的計算我們只需要精確到分,重量精確到克,最佳的設計是用int型別來代替浮點型,如果涉及到的數字比較大,超過int型的取值範圍(-2,147,483,648~2,147,483,647),最大金額為21474836.47,即兩千多萬,或者2147483.647公斤,哪麼我們可以用bigint,c#中使用long型別(9,223,372,036,854,775,808~9,223,372,036,854,775,807),最大金額92233720368547758.07,億億級,國家財政收入也就萬億,所以一般足夠用了,如果都是正數,還可以用ulong,設想一下,如果超過ulong型該怎麼處理,大家可以思考一下?

使用int型別來代替浮點數的好處是:計算速度上int型要快很多,至於快多少與數量級有關,但以現在的計算機計算能力,一般系統大可忽略這個影響;使用int最大的好處是:解決計算精度的問題,在涉及n條記錄合計取整時浮點數會有偏差,在資料加減處理上也比較麻煩,舉個例子:某個客戶賬戶資料庫餘額123.2301元,我們在介面顯示的時候只需要顯示123.23元,如果客戶消費123.23元,實際餘額為0,但資料庫中還有0.0001元,這樣我們需要在**中處理這多餘的0.0001元,有些人會說寫入時就把精度四捨五入處理好,但依然會涉及到精度處理以及與合計金額的偏差處理(多條記錄四捨五入後與實際合計金額會有偏差),如果使用int型代替浮點型,輸入時我們只要做乙個格式化處理就可以。

剖析金額不能用浮點數表示的原因

近期參與到了乙個金融專案,開發十分的謹慎。先丟擲我有問題的 作用是把以分為單位的金額轉成以元為單位的字串。long adjustfee string.valueof adjustfee 100.0 很自信的以為這行 簡潔明瞭的完成了使命。同事review了我的 後,指出這段 會造成精度丟失的問題。先...

浮點數金額轉換成大寫人民幣表示 C

把浮點資料轉換成大寫的人民幣表示,表示範圍從零分 九千九百九十九億九千九百九十九萬九千九百九十九元九角九分 0 999999999999.99 超過最大值範圍將丟擲異常。幾點說明 1.大寫人民幣表示我叫它 greatmoney 因為我不知道英文叫什麼,great也有大寫的意思,而且 有錢能使鬼推磨 ...

浮點數計算務必考慮浮點表示誤差並使用epsilon

對於浮點數的計算非常容易產生懶惰的想法而試圖忽視掉浮點表示的缺陷。最簡單的例子是浮點表示某些數值會有誤差,這個時候必須考慮使用epsilon。比如我要比較abs a b c d 的最小值,如果數值一樣就取字典最小序。如下版本是有問題的 double ans abs elements v 0 1.0 ...