浮點數舍入誤差
關于double和float的精度問題
在進行數值運算時,如果有float或者double類型的浮點數參與計算時,偶爾會出現結果不準确的情況。
浮點數在計算機中是無法進行準确表示的,比如0.1在計算機中隻是一個近似值,是以對浮點數運算結果具有不可預見性。如果兩個浮點操作數的誤差就能互相抵消,計算結果就能正确。
float : 單精度浮點數
double : 雙精度浮點數
兩者的主要差別如下:
01.在記憶體中占有的位元組數不同
單精度浮點數在機記憶體占4個位元組
雙精度浮點數在機記憶體占8個位元組
02.有效數字位數不同
單精度浮點數有效數字8位
雙精度浮點數有效數字16位
03.數值取值範圍
單精度浮點數的表示範圍:-3.40e+38~3.40e+38
雙精度浮點數的表示範圍:-1.79e+308~-1.79e+308
04.在程式中處理速度不同
一般來說,cpu處理單精度浮點數的速度比處理雙精度浮點數快
如果不聲明,預設小數為double類型,是以如果要用float的話,必須進行強轉
例如:float a=1.3; 會編譯報錯,正确的寫法 float a = (float)1.3;或者float a = 1.3f;(f或f都可以不區分大小寫)
注意:float是8位有效數字,第7位數字将會四舍五入
面試題:
1. java 中 3 * 0.1 == 0.3;将會傳回什麼?true還是false?
答:false, 因為浮點數不能完全精确的表示出來,一般會損失精度。
2. java 中 float f = 3.4; 是否正确?
答:不正确,3.4是雙精度數,将雙精度型(double)指派給浮點型(float)屬于向下轉型會造成 精度損失,是以需要強制類型轉換float f = (float)3.4;或者寫成 float f = 3.4f;才可以。
作者:走馬!