int X=100; int Y=200; System.out.println("X+Y="+X+Y); System.out.println(X+Y+"=X+Y");
该段代码的输出结果:
数据类型:内置、引用;
八种基本类型:6+1+1:6种数字类型,1种字符型,1种布尔型
1>byte 8位1字节,-128~127,
2>int 32位4字节 ,最小值是 -2,147,483,648(-2^31),最大值是 2,147,483,647(2^31 - 1)
3>Long 64位8字节,最小值是 -9,223,372,036,854,775,808(-2^63), 最大值是 9,223,372,036,854,775,807(2^63 -1)
4>float 单精度,32位
5>double 双精度 64位
6>short 16 位,最小值是 -32768(-2^15),最大值是 32767(2^15 - 1)
7>char 16 位 (Unicode编码) 最小值是 \u0000(即为0); 最大值是 \uffff(即为65,535);
结论:
1.整形到浮点型的数据类型转换会有精度损失
2.byte short int long float double 可以直接的相互转化(强转)
public class TestDouble { public static void main(String args[]) { System.out.println("0.05 + 0.01 = " + (0.05 + 0.01)); System.out.println("1.0 - 0.42 = " + (1.0 - 0.42)); System.out.println("4.015 * 100 = " + (4.015 * 100)); System.out.println("123.3 / 100 = " + (123.3 / 100)); } }
运行结果:
结论:
double型的数值在相加减的时候,会将数值转换成二进制的数值如10001.10010110011这种表示发再做相加减,,但是在转换成二进制代码表示的时候,存储小数部分的位数会有不够的现象,即无限循环小数,这就是造成微差距的主要原因。
解决方法:
java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。
package second; import java.math.BigDecimal; public class t3 { /* * 使用double类型的数值进行计算, 其结果是不精确的。 *java的设计者给编程人员提供了一个很有用的类BigDecimal, *他可以完善float和double类无法进行精确计算的缺憾。 */ //class static BigDecimalDemo { public static void main(String[] args){ System.out.println(ArithUtil.add(0.01, 0.05)); System.out.println(ArithUtil.sub(1.0, 0.42)); System.out.println(ArithUtil.mul(4.015, 100)); System.out.println(ArithUtil.div(123.3, 100)); } } class ArithUtil{ private static final int DEF_DIV_SCALE=10; private ArithUtil(){} //相加 public static double add(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.add(b2).doubleValue(); } //相减 public static double sub(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.subtract(b2).doubleValue(); } //相乘 public static double mul(double d1,double d2){ BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.multiply(b2).doubleValue(); } //相除 public static double div(double d1,double d2){ return div(d1,d2,DEF_DIV_SCALE); } public static double div(double d1,double d2,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1=new BigDecimal(Double.toString(d1)); BigDecimal b2=new BigDecimal(Double.toString(d2)); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } }