欢迎来到天天文库
浏览记录
ID:37728636
大小:322.29 KB
页数:45页
时间:2019-05-29
《JAVA高手之路(经验总结)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、长春JAVA开源技术推广主讲人:johson技术讨论群QQ:132516008网络实习/课堂:http://124.65.176.150:8080/bfpms/wwwJAVA编程中的须注意的细节数值表达式1.奇偶判断不要使用i%2==1来判断是否是奇数,因为i为负奇数时不成立,请使用i%2!=0来判断是否是奇数,或使用高效式(i&1)!=0来判断。2.小数精确计算System.out.println(2.00-1.10);//0.8999999999999999上面的计算出的结果不是0.9,而是一连串
2、的小数。问题在于1.1这个数字不能被精确表示为一个double,因此它被表示为最接近它的double值,该程序从2中减去的就是这个值,但这个计算的结果并不是最接近0.9的double值。一般地说,问题在于并不是所有的小数都可以用二进制浮点数精确表示。二进制浮点对于货币计算是非常不适合的,因为它不可能将1.0表示成10的其他任何负次幂。解决问题的第一种方式是使用货币的最小单位(分)来表示:System.out.println(200-110);//90第二种方式是使用BigDecimal,但一定要用Bi
3、gDecimal(String)构造器,而千万不要用BigDecimal(double)来构造(也不能将float或double型转换成String再来使用BigDecimal(String)来构造,因为在将float或double转换成String时精度已丢失)。例如newBigDecimal(0.1),它将返回一个BigDecimal,也即0.1000000000000000055511151231257827021181583404541015625,正确使用BigDecimal,程序就可以打印
4、出我们所期望的结果0.9:System.out.println(newBigDecimal("2.0").subtract(newBigDecimal("1.10")));//0.9另外,如果要比较两个浮点数的大小,要使用BigDecimal的compareTo方法。3.int整数相乘溢出我们计算一天中的微秒数:longmicrosPerDay=24*60*60*1000*1000;//正确结果应为:86400000000System.out.println(microsPerDay);//实际上为:
5、500654080问题在于计算过程中溢出了。这个计算式完全是以int运算来执行的,并且只有在运算完成之后,其结果才被提升为long,而此时已经太迟:计算已经溢出。长春JAVA开源技术推广主讲人:johson技术讨论群QQ:132516008网络实习/课堂:http://124.65.176.150:8080/bfpms/www解决方法使计算表达式的第一个因子明确为long型,这样可以强制表达式中所有的后续计算都用long运算来完成,这样结果就不会溢出:longmicrosPerDay=24L*60*6
6、0*1000*1000;4.负的十六进制与八进制字面常量“数字字面常量”的类型都是int型,而不管他们是几进制,所以“2147483648”、“0x180000000(十六进制,共33位,所以超过了整数的取值范围)”字面常量是错误的,编译时会报超过int的取值范围了,所以要确定以long来表示“2147483648L”、“0x180000000L”。十进制字面常量只有一个特性,即所有的十进制字面常量都是正数,如果想写一个负的十进制,则需要在正的十进制字面常量前加上“-”即可。十六进制或八进制字面常量可
7、就不一定是正数或负数,是正还是负,则要根据当前情况看:如果十六进制和八进制字面常量的最高位被设置成了1,那么它们就是负数:System.out.println(0x80);//128//0x81看作是int型,最高位(第32位)为0,所以是正数System.out.println(0x81);//129System.out.println(0x8001);//32769System.out.println(0x70000001);//1879048193//字面量0x80000001为int型,最高位
8、(第32位)为1,所以是负数System.out.println(0x80000001);//-2147483647//字面量0x80000001L强制转为long型,最高位(第64位)为0,所以是正数System.out.println(0x80000001L);//2147483649//最小int型System.out.println(0x80000000);//-2147483648//只要超过32位,就需要在字面常量后加L强转long,否则编译
此文档下载收益归作者所有