簡體   English   中英

浮點數字

[英]Floating Point Numbers

這似乎是一個非常簡單的問題,但我只是想清除我的疑問。 我正在看其他開發人員編寫的代碼。 有些計算涉及浮點數。

示例: Float fNotAvlbl = new Float(-99); 他為什么要創建一個新對象? 如果我們執行Float fNotAvlbl = -99;會發生什么? (-99用作標志,指示不適用)在代碼的后面,我們定義:

fltValue1 = 0.00f;
fltValue2 = 0.00f;

並使用返回float的方法調用填充這兩個值。 之后,我們再次將這兩個值轉換為Float對象:

fltVal1 = new Float(fltValue1); 
fltVal2 = new Float(fltValue2); 

然后比較if(fltVal1.compareTo(fNotAvailable) == 0) do something.
這是因為compareTo期望包裝器類對象嗎?

抱歉,這是一個真正的基本問題。

  • 您根本不需要包裝器
  • 即使您需要它們,也不推薦使用構造函數-而是使用Float.valueOf(..)
  • 編寫Float fNotAvlbl = -99; 依賴自動裝箱,自動裝箱僅在Java 5中添加,因此較舊的代碼無法使用它。
  • 使用-99作為浮點值表示“不適用”確實非常糟糕。 使用nullFloat.Nan
  • fltVal1.compareTo(fNotAvailable) == 0表示與fltValue1==fltValue2
  • 不應對浮點值進行嚴格相等的比較,因為它經常無法按預期工作。 閱讀浮點指南以了解原因。

關於compareTo()==進行比較的主題

float a = Float.NaN;
float b = Float.NaN;
System.out.println(a + " == " + b + " is " + (a == b));
System.out.println(a + ".compareTo(" + b + ") is " + ((Float) a).compareTo(b));

float c = -0.0f;
float d = 0.0f;
System.out.println(c + " == " + d + " is " + (c == d));
System.out.println(c + ".compareTo(" + d + ") is " + ((Float) c).compareTo(d));

版畫

NaN == NaN is false
NaN.compareTo(NaN) is 0
-0.0 == 0.0 is true
-0.0.compareTo(0.0) is -1

compareTo比較二進制表示形式(將所有NaN值標准化為相同之后),因為-0.0f和0.0f的二進制表示形式不同,compareTo不會返回0。除了使用floatToIntBits() ,代碼中沒有其他特殊處理。並使用==比較該instea自由度

由於浮點比較的內在問題,比較可能使用Float對象而不是內置的float類型。 由於浮點數存儲在計算機系統上的方式有時會導致兩個浮點數之間的相等性比較產生錯誤的否定性。 FloatcompareTo可能會考慮到這一點。 最初的作者可能至少認為這樣做了。

您還可以編寫自己的浮點比較算法,以檢查系統的合理標准偏差內的差異。 您也可以使用Float中的equals使用的方法,該方法查看每個數字的浮點位的整數值。

請注意,本身使用Float並不能解決此問題,因為該問題是存儲中的舍入錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM