//=============================输出奇数 public class OddTest { public static boolean isOdd(int i){ return i % 2 != 0; //比较 i % 2 == 0;注: -1%2 = -1 } public static void main(String[] args) { for(int i = -10; i <= 10; i++) { System.out.println(isOdd(i)); } } } //=============================浮点数相减 import java.math.BigDecimal; public class DoubleMinus { public static void main(String[] args) { System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.1"))); System.out.printf("%.1f", 2.0-1.1);//比较 System.out.println(2.0 - 1.1) = 0.8999999999999999 } } 为什么浮点数会丢失精度? 十进制数的二进制表示可能不够精确 浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。 注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。 类型失配 您可能混合了浮点数和双精度浮点数类型。请确定您在进行数学运算的时候所有的数据类型全部相同。 注意:float类型的变量只有7位的精度,而double类型的变量有15位的精度。 如何进行浮点数精度计算? Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。 这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。 四舍五入 我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数,我们只能象这样(保留两位): public double round(double value){ return Math.round(value*100)/100.0; } 非常不幸,上面的代码并不能正常工作,给这个方法传入4.015它将返回4.01而不是4.02,如我们在上面看到的 4.015*100=401.49999999999994 因此如果我们要做到精确的四舍五入,不能利用简单类型做任何运算 java.text.DecimalFormat也不能解决这个问题 ...... //=============================长整除 public class LongDivision { public static void main(String[] args) { final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000; //微秒 final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000; //毫秒 // 注意L ,无L则每相乘赋值INT,结果溢出 System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY); } } //=============================字符串和字符 public class CharAndString { public static void main(String[] args) { System.out.println("H" + "a"); System.out.println('H' + 'a'); //输出整数 } } //=============================StringBuffer new StringBuffer('A') //被解释成 new StringBuffer(65); //=============================整数边界问题 public class WhileTest { public static final int END = Integer.MAX_VALUE; public static final int START = END - 100; public static void main(String[] args) { int count = 0; for (int i = START; i <= END; i++) //当i = Interger.Max_VALUE时,还会再加 count++; System.out.println(count); } }//死循环 //=============================finally public class GoodBye { public static void main(String[] args) { try { System.out.println("Hello world"); //不会输出Goodbye world,因为程序退出 System.exit(0); } finally { System.out.println("Goodbye world"); } } } //=============================关闭了吗 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class IOTest { public static void main(String[] args) { } public static void copy(String src, String dest) throws IOException { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(src); out = new FileOutputStream(dest); byte[] buf = new byte[1024]; int n; while ((n = in.read(buf)) > 0) out.write(buf, 0, n); } finally { // if (in != null) in.close(); //close时会抛出IOExecption。 if(in != null) try{ in.close() }finally{ in = null } // if (out != null) out.close(); } } } //=============================输出奇数 //=============================输出奇数 //=============================输出奇数 //=============================输出奇数 //=============================输出奇数 //=============================输出奇数 //=============================输出奇数