文档详情

JAVA高手之路(经验总结).pdf

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