天天看點

浮點數舍入誤差

浮點數舍入誤差

關于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;才可以。

浮點數舍入誤差

作者:走馬!