A. 為什麼說java的浮點運算危害了普天下的芸芸眾生
JAVA在基本 float 類型和包裝類 Float 之間,用於比較 NaN 和 -0 的規則是不同的。對於 float 值,比較兩個 NaN 值是否相等將會得到 false ,而使用 Float.equals() 來比較兩個 NaN Float 對象會得到 true 。造成這種現象的原因是,如果不這樣的話,就不可能將 NaN Float 對象用作 HashMap 中的鍵。類似的,雖然 0 和 -0 在表示為浮點值時,被認為是相等的,但使用 Float.compareTo() 來比較作為 Float 對象的 0 和 -0 時,會顯示 -0 小於 0 。
由於無窮大、NaN 和 0 的特殊行為,當應用浮點數時,可能看似無害的轉換和優化實際上是不正確的。例如,雖然好象 0.0-f 很明顯等於 -f ,但當 f 為 0 時,這是不正確的。還有其它類似的 gotcha。
浮點運算很少是精確的。雖然一些數字(譬如 0.5 )可以精確地表示為二進制(底數 2)小數(因為 0.5 等於 2 -1),但其它一些數字(譬如 0.1 )就不能精確的表示。因此,浮點運算可能導致舍入誤差,產生的結果接近【但不等於】您可能希望的結果。
不要用浮點值表示精確值,一些非整數值(如幾元和幾分這樣的小數)需要很精確。浮點數不是精確值,所以使用它們會導致舍入誤差。因此,使用浮點數來試圖表示象貨幣量這樣的精確數量不是一個好的想法。使用浮點數來進行美元和美分計算會得到災難性的後果。浮點數最好用來表示象測量值這類數值,這類值從一開始就不怎麼精確。
B. JAVA中怎麼判斷兩個浮點數相等
一般情況下: 浮點數的相等 ,可以使用 == 進行比較 . 但是浮點數, 畢竟涉及到精度問題, 如果要考慮精度的問題 ,那麼可以使用BigDecimal 類
參考代碼
publicclassTest{
publicstaticvoidmain(String[]args){
System.out.println(0.1*3==0.3);//false
System.out.println(0.1*3);//0.30000000000000004
System.out.println(0.3d);//0.3
BigDecimalb1=newBigDecimal("0.1");
BigDecimalb2=newBigDecimal("3");
BigDecimalb3=newBigDecimal("0.3");
BigDecimalb4=b1.multiply(b2);//乘法
if(b4.compareTo(b3)==0){//如果兩者比較結果為0,那麼就是相等
System.out.println("相等");
}else{
System.out.println("不等");
}
}
}
C. java中的float類型
java中的float類型
.浮點類型
1) 與整數類型一樣,同樣有固定的表述范圍和欄位長度,且不受具體的操作系統的影響,保證了Java的跨平台性
2) Java語言中,浮點類型有兩種表現形式,分別是:
a. 十進制數形式, 如3.14
b. 科學計數法,如,3.14e2, 3.14e-2, -3.14E2
3) Java語言中,默認的浮點數類型是double,聲明float類型的時候,後面必須添加字母f或者F,如3.14F,3.14f
4) Java中兩種浮點類型的表述范圍:
D. java double和float的區別
1、內存結構
float和double的范圍是由指數的位數來決定的。
float的指數位有8位,而double的指數位有11位,分布如下:
float:
1bit(符號位)
8bits(指數位)
23bits(尾數位)
double:
1bit(符號位)
11bits(指數位)
52bits(尾數位)
於是,float的指數范圍為-128~+127,而double的指數范圍為-1024~+1023,並且指數位是按補碼的形式來劃分的。
其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值范圍。
float的范圍為-2^128
~
+2^127,也即-3.40e+38
~
+3.40e+38;double的范圍為-2^1024
~
+2^1023,也即-1.79e+308
~
+1.79e+308。
2.
精度
float和double的精度是由尾數的位數來決定的。浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含著的「1」,由於它是不變的,故不能對精度造成影響。
float:2^23
=
8388608,一共七位,由於最左為1的一位省略了,這意味著最多能表示8位數:
2*8388608
=
16777216
。有8位有效數字,但絕對能保證的為7位,也即
float的精度為7~8位有效數字
double:2^52
=
4503599627370496,一共16位,同理,
double的精度為16~17位
之所以不能用f1==f2來判斷兩個數相等,是因為雖然f1和f2在可能是兩個不同的數字,但是受到浮點數表示精度的限制,有可能會錯誤的判斷兩個數相等!
E. java中為什麼long的范圍小於float求解答
因為long要存儲嚴格的整數,有嚴格的范圍限制,精度永遠為1
float是浮動精度。支持小數,但數值達到一定大的時候,就會出現誤差。
當float的值達到一定大小,程序中遇到2個float比較的時候會出現應該相等,但結果不等,或者應該不等卻相等的情況。因為float是有誤差的
long沒有誤差,但不能有小數。。
F. java里如何在輸出浮點數小數部分為0時自動將小數點和小數部分隱藏
可以直接以浮點數和其強轉為整數的數值進行比較,相同則直接取整數,即去掉小數點;
否則,即不同時,原樣輸出;
PS.