一道很簡單的期望題,已知概率p求期望
顯然期望為1/p
但在精度處理上就有點麻煩了,題目要求答案以最簡分數的形式輸出,誤差要小於1e-6
但我一開始錯誤的使用了除法運算求1/p,再求(1/p*1e6)/1e6的最簡分數
很顯然精度丟失
這是一條大忌,在高精度問題中一定要避免使用除法
所以正解是求1e6/(p*1e6)的最簡分數
但這裡又有乙個精度問題,我們算式裡的p,是對題目給出資料q,求p=1.0-q得到的
如果我們直接求1.0-q,同樣會丟失精度(經測試,1.0-q只保留小數點後6位,會導致最終誤差會大於1e-6)
但先乘以1e6就可以避免這個問題,所以解為1e6/(1e6-1e6*q)
所以在高精度問題中,盡量避免除法,在加減法中也要提防精度丟失
double型別精度損失問題
在十進位制中小數有些是無法完整用二進位制表示的。它們只能用有限位來表示,從而在儲存時可能就會有誤差。十進位制的小數採用乘2取整法進行計算,去掉整數部分後,剩下的小數繼續乘以2,直到小數部分全為0.有的小數可能取不到零就會一直迴圈 0.9 2 1.8 取整1 0.8 2 1.6 取整1 0.6 2 1...
double精度問題
double 相乘向上取整 param params return public static int upscore double d1,double d2 bigdecimal.setscale 方法用於格式化小數點 setscale 1 表示保留一位小數,預設用四捨五入方式 setscale ...
double和float精度問題
遇到問題 後台返回的0.0008客戶端顯示的是科學計數法。解決 把後台返回的資料先轉成bigdecimal型別再保留指定小數 注意 返回的數必須大於0,不大於0時要先判斷,不然保留的小數字數多的話還會科學計數法顯示。當後台返回的是0,我這裡保留了9位小數,還是科學計數法顯示的。bigdecimal ...