E754浮點數運算誤差用Bigdecimal解決

2022-09-23 21:06:17 字數 1077 閱讀 5230

j**a.math. bigdecimal

double型別:1.0-0.8的結果不是0.2,而是0.19999999999999996

所以常用if(abs(result)

你使用別的程式語言(如 j**ascript.、 python等)也有可能顯示這個結果。

簡單來說,j**a(包括其他程式語言)遵守e754浮點數運算( floating- -point arithmetic規範,使用分數與指數來表示浮點數。例如,0.5會使用1/2來表示,0.75會使用1/2+1/4來表示,0.875會使用1/2+14+18來表示,而0.1會使用16+1/32+1256+1/512+1/4096+18192+…無限迴圈下去,無法精確表示,因而造成運算上的誤差

再來舉個例子,你覺得以下程式片段會顯示什麼結果?

package hello;

public class bigdecimal else }

}由於浮點數誤差的關係,結果是顯示「不等於0.3」。類似的例子還很多,結論就是,如果要求精確度,那就要小心使用浮點數,而且別用=直接比較浮點數運算結果

可以使用j**a.math.bigdecimal類.

bigdecimal op1=new bigdecimal("1.0");

bigdecimal op2=new bigdecimal("0.8");

bigdecimal result=op1.subtract(op2);

system.out.println(result);輸出為0.2.

同理new?bigdecimal 三個0.1呼叫add判斷結果為相等

if(op.add(op2).add(op3).equals(result))3、

bigdecimal op1=new bigdecimal("1.0");

bigdecimal op2=new bigdecimal("1.0");system.out.println(op1==op2);//falsesystem.out.println(op1.equals(op2));//true因為用==比較op1、op2,兩者為兩個新建的不同bigdecimal,

而equals 比較的是內含值0.1所以true

浮點數的運算原理 IEEE 754

ieee二進位制浮點數算術標準 ieee 754 是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多cpu與浮點運算器所採用。ieee 754規定了四種表示浮點數值的方式 單精確度 32位 雙精確度 64位 延伸單精確度 43位元以上,很少使用 與延伸雙精確度 79位元以上,通常以80位元實做...

浮點數運算

浮點數運算的公式 n m re n代表浮點數 m代表尾數 r代表基數 e代表指數 所謂浮點數就是類似我們高中學的科學計數法 比如 1000 就表示為 1.0 103 那麼浮點型計算就是兩個用科學計數法表示的數之間進行的計算 例如 1.0 102 1.19 103 該如何計算 步驟 1.對階 所謂對階...

浮點數運算

今天學習了浮點數運算 加減乘除 浮點數運算主要包括兩部分 指數運算和尾數運算。在ieee754標準下,指數運算就是階碼的運算,類似於無符號數運算。尾數運算是原碼運算。之前一直很疑惑為什麼前面的教材在介紹原碼運算 加減乘除 所舉的例子都是小數運算。現在猜想那部分內容可能只是為了浮點數運算做鋪墊,這裡才...