double型別的精度問題

2022-05-01 12:27:09 字數 407 閱讀 5168

一道很簡單的期望題,已知概率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 ...