Java中的基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。
数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型是有符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。
先看看各种类型所占的字节长度,long型和double型都占8个字节,float和int占4个字节,short和char占2个字节,byte占1个字节,boolean型的占一个bit。
Java中的基本类型又都有对应的一个封装类,如int所对应的Integer,适用于要求参数是对象的情况。
下面是一些使用基本类型需要注意的细节:
1.java的数值是有符号的,不要忘了还要考虑负数
判断一个数是不是奇数,
if( i % 2 == 1){
...
}
如果i是负数,i%2 的结果将是-1.应该是写成:
if( i%2 ! =0){
}
2.如果使用小数,默认的将是double类型,如果写成
float f = 1.24;
则会造成精度的丢失,应该显示的指明小数的类型
float f = 1.24f;
3.小数都可能会有精度的丢失,使用float和double做小数计算时可能都会碰到这样的问题,如果就是需要精确地计算,可以考虑使用BigDicemal,整型对应的是BigInteger。
System.out.println(3.0f - 1.0f);
System.out.println(3.0d - 1.0d);
float f = 20014999;
System.out.println(f);
float型所占用内存
double型所占用的内存
整数可以用二进制精确地表示 ,但小数就不一定了。关于小数到二进制的转换,可以参考:http://www.blogjava.net/jelver/articles/340038.html
下面是BigDicemal的一个封装类,来自网上,需要使用时直接调用方法即可。
import java.math.BigDecimal; public class Utils { /** 精度 */ private static final int DEF_DIV_SCALE = 10; /** * 加,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal add(Object v1, Object v2) { BigDecimal result = null; BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.add(b2); return result; } /** * 减,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal sub(Object v1, Object v2) { BigDecimal result = null; // if(v1!=null && v2!=null){ BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.subtract(b2); // } return result; } /** * 乘,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal mul(Object v1, Object v2) { BigDecimal result = null; // if(v1!=null && v2!=null){ BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.multiply(b2); // } return result; } /** * 除,BigDecimal用 * * @param v1 * @param v2 * @return result */ public static BigDecimal div(Object v1, Object v2) { BigDecimal result = null; BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.divide(b2); return result; } /** * * @param v1 * @param v2 * @param scale * @return result */ public static BigDecimal div(Object v1, Object v2, int scale) { BigDecimal result = null; if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(v1.toString()); BigDecimal b2 = new BigDecimal(v2.toString()); result = b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP); return result; } public static BigDecimal round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP); } }