簡體   English   中英

int或float表示只能是整數或“#.5”的數字

[英]int or float to represent numbers that can be only integer or “#.5”

情況

我處於一種情況,我會在大約0到15之間有很多數字。絕大多數是整數,但是很少會有十進制值。 所有帶有十進制值的值都將是“#.5”,因此是1.5、2.5、3.5等,但絕不會是1.1、3.67等。

我在使用floatint (值乘以2,所以小數點消失)之間float ,無法存儲這些數字。

因為每個值是3.5,我可以放心地使用float ,而不必擔心與浮點數走來的wierdness 還是我需要使用int 如果我使用int ,是否可以將每個float除以2以安全地給出絕對正確的float

有沒有更好的方法我想念?

其他資訊

我沒有考慮double因為我不需要那種精度或范圍。

我將它們存儲在包裝器類中,如果每當我需要獲取值時都使用int ,則將返回的intfloat除以2。

最后我去了什么

float似乎是要走的路。

這不是理論證明,但您可以憑經驗進行測試:

public static void main(String[] args) {
  BigDecimal half = new BigDecimal("0.5");
  for (int i = 0; i < Integer.MAX_VALUE; i++) {
    float f = i + 0.5f;
    if (new BigDecimal(f).compareTo(new BigDecimal(i).add(half)) != 0) {
      System.out.println(new BigDecimal(i).add(half) + " => " + new BigDecimal(f));
      break;
    }
  }
}

印刷品:

8388608.5 => 8388608

意味着所有xxx.5都可以精確地表示為0.5到8388607.5之間的浮點數。

對於較大的數字,float的精度不足以表示該數字,並且將其四舍五入為其他值。

讓我們將小數部分為.0或.5的浮點數子集稱為點五浮點數或PFF。

保證以下屬性:

  • 任何以.0或.5結尾的不超過800萬左右(准確地說是2 ^ 23)的數字都可以表示為PFF。
  • 除非有溢出,否則將兩個PFF相加/相減會得到一個PFF。
  • 除非有溢出,否則將PFF乘以整數會得到PFF。

這些屬性由IEEE-754規則保證,該規則給出24位尾數並保證精確結果的精確舍入。

使用int會給您更大的范圍。

在該范圍內,浮點數的.5不會有精度問題,因此這兩種方法都可以使用。

如果這些值代表實際的數字值,我之所以選擇浮點數僅僅是因為它消耗了相同數量的內存,並且我不需要編寫代碼就可以在某些內部int表示形式和公開的浮點值之間進行轉換。

如果這些數字表示值以外的其他值,例如來自非常有限的等級,則我將考慮將它們建模為枚舉,這取決於最終使用方式。

暫無
暫無

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

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