Java学习中,所遇到的⼀些问题及解决⽅案
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.
bigdecimal转换为integerat 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,可以调⽤adByte()或adBytes(length)。adByte() 直接返回⼀个字节的数据,adBytes(length) 返回length个字节的数据。在这⾥,如果你需要的是⼀个array型的数据,你可以直接使
⽤adBytes(length).array() 。当你仅仅需要⼀个字节的数据时,length设置为1即可。
3 在今天码代码的过程中,被指出有些代码有些冗余。
public void test(){
String hexAltposi = "e8";
ChannelBuffer posi = piedBuffer(StrUtil.hexStringToBytes(hexAltposi));
//hexStringToBytes()是把hexAltposi由16进制字符串转换成字节
//希望从buffer中取出数,并转化成int,先写出之前的代码
System.out.println(Util.asInt(StrUtil.adBytes(1).array())));
//再码出现在的代码
System.out.prinlen((int) adUnsignedByte());
}
出现这种情况的原因,是因为⾃⼰对Buffer API的认识不⾜。
我在这⾥再列出⼏个API的⼩技巧吧。
①adableBytes() 不会使buffer的读取索引值增加或减少
②buffer.skipBytes(length) 会直接使buffer的读取索引值增加length。当你的buffer中含有⼀些你⽤不知道 字段或者在buffer的末尾有⼀些不⽤的字段,可以直接使⽤此⽅法跳过。
③有时(int) adByte() 时读取的数据会变成负的值,这⾥需要使⽤(int) adUnsignedByte() 。
…
4 对于Integer var = ? 在-128⾄127范围内的赋值,Integer对象是在IntegerCache.cache产⽣,会复⽤已有对象,这个区间内的Integer值可以直接使⽤==进⾏判断,但是这个区间之外的所有数据,都会在堆上产⽣,并不会复⽤已有对象,这是⼀个⼤坑,推荐适应equals⽅法进⾏判断。(这⼀段引⽤的是阿⾥巴巴java开发⼿册中的话)
此博客持续更新中……
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论