[英]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等。
我在使用float
和int
(值乘以2,所以小數點消失)之間float
,無法存儲這些數字。
因為每個值將是3.5,我可以放心地使用float
,而不必擔心與浮點數走來的wierdness ? 還是我需要使用int
? 如果我使用int
,是否可以將每個float
除以2以安全地給出絕對正確的float
?
有沒有更好的方法我想念?
我沒有考慮double
因為我不需要那種精度或范圍。
我將它們存儲在包裝器類中,如果每當我需要獲取值時都使用int
,則將返回的int
為float
除以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。
保證以下屬性:
這些屬性由IEEE-754規則保證,該規則給出24位尾數並保證精確結果的精確舍入。
使用int
會給您更大的范圍。
在該范圍內,浮點數的.5不會有精度問題,因此這兩種方法都可以使用。
如果這些值代表實際的數字值,我之所以選擇浮點數僅僅是因為它消耗了相同數量的內存,並且我不需要編寫代碼就可以在某些內部int表示形式和公開的浮點值之間進行轉換。
如果這些數字表示值以外的其他值,例如來自非常有限的等級,則我將考慮將它們建模為枚舉,這取決於最終使用方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.