『壹』 java中的浮點數范圍及IEEE 754標准中的規定是否相同,為什麼
相同,JAVA遵循IEEE754。
0x7f800000應該定義為正無窮大,
java.lang.Float中用public static final float POSITIVE_INFINITY 定義。
按IEEE754,實際值大概是
0x7f800000
S' E'(移碼) D'
0 1111 1111 000 0000 0000 0000 0000 0000
S E(符號取反的補碼) D
+1 0 111 1111 1.000 0000 0000 0000 0000 0000
S ES ED D
+1 0 111 1111 1.000 0000 0000 0000 0000 0000
Data = S*D*(2^E) = (+1)*1.0*(2^127) = 2^127
『貳』 浮點數因截斷誤差不能精確比較,為何java里有時可以有時不可以
可以乘以10 變為整數循環
『叄』 為什麼說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 )就不能精確的表示。因此,浮點運算可能導致舍入誤差,產生的結果接近【但不等於】您可能希望的結果。
不要用浮點值表示精確值,一些非整數值(如幾元和幾分這樣的小數)需要很精確。浮點數不是精確值,所以使用它們會導致舍入誤差。因此,使用浮點數來試圖表示象貨幣量這樣的精確數量不是一個好的想法。使用浮點數來進行美元和美分計算會得到災難性的後果。浮點數最好用來表示象測量值這類數值,這類值從一開始就不怎麼精確。
『肆』 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("不等");
}
}
}
『伍』 JAVA關於浮點數比較的問題
因為浮點數在java中是不精確的,比如double d=2.01,你列印出來也是2.01,但是實際上java虛擬機存儲的是2.010000000001這個數,java的浮點數不能存儲精確的小數點
『陸』 java中float和double的區別...
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在可能是兩個不同的數字,但是受到浮點數表示精度的限制,有可能會錯誤的判斷兩個數相等!
『柒』 java如何判斷兩個float怎麼比大小
浮點數判斷需要注意,float 和double 的精度范圍,超過范圍的數字會被忽略
(1) 浮點數大小判斷
如果沒有等號關系在裡面,也就必然一大一小,那麼直接用 > 或者 <
(2) 浮點數相等判斷
因為 浮點數在內存中存放,可能無法精確的儲存,所以同一個值,可能有不同的內存數據,所以要使用以下的方法:
以float 為例,32位APP中精度為 6-7,所以取 1e-7。
兩個數字 A 、 B,
if ( |A-B| <1e-7 ) 則 A、B相等。
『捌』 java里的浮點數是什麼意思
float表示單精度浮點數在機內佔4個位元組,用32位二進制描述。
浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。
數符佔1位二進制,表示數的正負。
指數符佔1位二進制,表示指數的正負。
尾數表示浮點數有效數字,0.xxxxxxx,但不存開頭的0和點
指數存指數的有效數字。
指數佔多少位,尾數佔多少位,由計算機系統決定。
可能是數符加尾數佔24位,指數符加指數佔8位 -- float.
『玖』 java 的浮點數&整數
浮點數多數不能精確表示。
近似相等可以用兩數差的絕對值小於某個足夠小的數來判定。
『拾』 java中如何判斷一個浮點數是float型的還是double的
java中常量
的浮點數字就被認為是double型的,而且不能直接賦給float型的變數。。像float
a=1.2;
這樣的編繹直接出錯。。要寫成float
a=1.2f;
才行。