double型別精度損失問題

2021-09-13 02:29:19 字數 1138 閱讀 1507

在十進位制中小數有些是無法完整用二進位制表示的。它們只能用有限位來表示,從而在儲存時可能就會有誤差。十進位制的小數採用乘2取整法進行計算,去掉整數部分後,剩下的小數繼續乘以2,直到小數部分全為0.

有的小數可能取不到零就會一直迴圈

0.9*2=1.8…...取整1

0.8*2=1.6…...取整1

0.6*2=1.2…...取整1

0.2*2=0.4.…..取整0

0.4*2=0.8…...取整0

0.8*2=1.6…...取整1

我們計算0.3+0.4:

double a = 0.3 + 0.4;

printf("%f\n",a);

可以精確的顯示0.7,其實在計算機上 0.3 + 0.4 根本就不等於 0.7 (為什麼?),看下面**就很清楚了:

#include using namespace std;

typedef long long ll;

int main()

因為 0.3 和 0.4 都不能被精確表示。浮點數的精度丟失在每乙個表示式,而不僅僅是表示式的求值結果。用printf輸出的時候其實已經四捨五入了。

注意:把float\double強轉化為int型別時,只取整數部分不會四捨五入。

#include using namespace std;

typedef long long ll;

int main()

針對小數精度不夠的問題(例如 0.74),軟體可以人為的在資料最後一位補 5, 也就是 0.745,還原的時候再去掉尾巴5即可:

#include using namespace std;

typedef long long ll;

int main()

double型別的精度問題

一道很簡單的期望題,已知概率p求期望 顯然期望為1 p 但在精度處理上就有點麻煩了,題目要求答案以最簡分數的形式輸出,誤差要小於1e 6 但我一開始錯誤的使用了除法運算求1 p,再求 1 p 1e6 1e6的最簡分數 很顯然精度丟失 這是一條大忌,在高精度問題中一定要避免使用除法 所以正解是求1e6...

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 ...