關於精度問題

2021-08-28 01:38:52 字數 579 閱讀 3923

原價是18元,優惠17.99元,儲存的最終**是0.02元。看了一下**:

discount = (long) (double.parsedouble(dis)*100);

freight = (long) (double.parsedouble(fre)*100);

用這段**做了測試就發現問題所在了。是精度問題,然後強制long轉換後,把小數後面的內容給丟了。

public static void main(string args)
輸出結果:

1798.9999999999998

1798

1099.0

1099

899.0

899

最簡單的解決方案,在long強制轉化前四捨五入,**如下

system.out.println((long) math.round((double.parsedouble("17.99")*100)));
更優化的寫法當然是用bigdecimal,上面只是最偷懶的修改方式。

高精度之關於高精度的其他問題

高精度階乘其實就是加法的高階版,樸素的版本可以模擬階乘過程,首先階乘的資料必定不會太大,所以可以持續用高精度乘以低精度進行計算。但是問題是當n 稍微大一點就會導致執行超時。所以可以把n 拆成n n 1 n 2 n 3 或是更少的組進行計算,最後再採用高精度乘以高精度合併結果。當給出的資料位數很大時帶...

關於C builder中精度丟失的問題

原意 現有應交款項m元,折扣率n 0 n 1 折扣金額採取向下取整制,求折扣後金額lastmoney 公式 lastmoney m m 1 n 現設m 為 14.25元 折扣率n為0.8 根據公式計算 int norginmoney 1425 換成分為單位進行計算 double drebate 0....

關於float相減精度丟失的問題

小數的二進位制表示問題 首先我們要搞清楚下面兩個問題 1 十進位制整數如何轉化為二進位制數 演算法很簡單。舉個例子,11表示成二進位制數 11 2 5 餘 1 5 2 2 餘 1 2 2 1 餘 0 1 2 0 餘 1 0結束 11二進位制表示為 從下往上 1011 這裡提一點 只要遇到除以後的結果...