1、在使用BigDecimal資料類型做除法運算的時候,彈出如下異常:
public static void main(String[] args){ BigDecimal a = new BigDecimal(1000); BigDecimal b = new BigDecimal(1500); System.out.println(a.divide(b));}Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(BigDecimal.java:1690) at test.Test.main(Test.java:16)
問題出現的原因是:
a和b相除的結果不能使用一個有限的decimal數表示。
所以為瞭解決這個問題,我們應該給結果設定一個範圍。代碼如下
public static void main(String[] args){ BigDecimal a = new BigDecimal(1000); BigDecimal b = new BigDecimal(1500); System.out.println(a.divide(b, 2, BigDecimal.ROUND_HALF_UP));}
這個問題,我在網上也找過一些答案,如,有一個說給divide方法設定一個小數點精度,a.divide(b, 2),就那上面代碼的值做輸入,得到的結果卻是1,很明顯這不一定是我們想要的答案。
2 在使用bytebuffer時,如果你想讀取buffer中的byte,可以調用buffer.readByte()或buffer.readBytes(length)。buffer.readByte() 直接返回一個位元組的資料,buffer.readBytes(length) 返回length個位元組的資料。在這裡,如果你需要的是一個array型的資料,你可以直接使用buffer.readBytes(length).array() 。當你僅僅需要一個位元組的資料時,length設定為1即可。
3 在今天碼代碼的過程中,被指出有些代碼有些冗餘。
public void test(){ String hexAltposi = "e8"; ChannelBuffer posi = ChannelBuffer.copiedBuffer(StrUtil.hexStringToBytes(hexAltposi)); //hexStringToBytes()是把hexAltposi由16進位字串轉換成位元組 //希望從buffer中取出數,並轉化成int,先寫出之前的代碼 System.out.println(Util.asInt(StrUtil.bytesToHexString(posi.readBytes(1).array()))); //再碼出現在的代碼 System.out.prinlen((int) posi.readUnsignedByte());}
出現這種情況的原因,是因為自己對Buffer API的認識不足。
我在這裡再列出幾個API的小技巧吧。
①buffer.readableBytes() 不會使buffer的讀取索引值增加或減少
②buffer.skipBytes(length) 會直接使buffer的讀取索引值增加length。當你的buffer中含有一些你用不知道 欄位或者在buffer的末尾有一些不用的欄位,可以直接使用此方法跳過。
③有時(int) buffer.readByte() 時讀取的資料會變成負的值,這裡需要使用(int) buffer.readUnsignedByte() 。
…
4 對於Integer var = 。 在-128至127範圍內的賦值,Integer對象是在IntegerCache.cache產生,會複用已有對象,這個區間內的Integer值可以直接使用==進行判斷,但是這個區間之外的所有資料,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦適應equals方法進行判斷。(這一段引用的是阿里巴巴java開發手冊中的話)
此部落格持續更新中……