java使用分数与指数来表示浮点数。例如:0.5使用1/2表示,0.75使用1/2 + 1/4表示,0.875使用1/2 + 1/4 + 1/8表示,0.1使用1/16 + 1/32 + 1/256 + 1/4096 + 1/8192 + …无限循环下去,,无法精确表示,因而造成运算上的误差。
System.out.println(1.0-0.8);
上式的结果是:0.19999999999999996.
double a = 0.1;
double b = 0.1;
double c = 0.1;
if((a+b+c)==0.3)
System.out.println("dengyu");
else
System.out.println("budengyu ");
输出结果为:budengyu
可以使用java.math.BigDecimal类。
import java.math.*;
public class aaa {
public static void main(String args[]) {
BigDecimal operand1 = new BigDecimal("1.0");
BigDecimal operand2 = new BigDecimal("0.8");
BigDecimal result = operand1.subtract(operand2);
System.out.println(result);
}
输出结果为:0.2
创建BigDecimal的方法之一是使用字符串,BigDecimal在创建时会剖析传入的字符串,一默认精度进行接下来的运算。BigDecimal提供add()、subtract()、multiply()、divide()等方法,分别是加、减、乘、除,这些方法会返回代表运算结果的BigDecimal。
BigDecimal result = operand1.subtract(operand2).setScale(3,BigDecimal.ROUND_HALF_UP);
输出结果:0.200
setScale() 第一个参数设置保留小数点后的位数,BigDecimal.ROUND_HALF_UP表示四舍五入。
BigDecimal result = operand1.subtract(operand2).add(operand1);
这样写可以进行连续的计算。
对象指定与相等性
当 = 用于基本类型时,是将值赋值给变量,当 == 用于基本类型时,是比较两个变量储存的值是否相等。
当在操作对象时: = 是用在指定参考名称参考某个对象,而 = = 是用在比较两个参考名称是否参考同一对象。= 使用在将某个名牌绑定到某个对象,= = 是用在比较两个名牌是否帮到同一个对象。
别用= = 或! =来比较两个对象实质内容值是否相同(因为= = 与! =是比较对象参考),而要用equals().
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.1");
System.out.print(a==b);
这段程序输出结果为:false
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.1");
System.out.print(a.equals(b));
输出结果为:true
new关键词就是建立对象,这个对象内含“0.1”,并建立一个名牌a绑定到这个新建立的对象。
使用a == b就是再问 a 名牌绑定的对象是否就是 b 名牌绑定的对象。
a.equals(b)在问 a 名牌绑定的对象与 b 名牌绑定的对象,实际上内涵值是否相同。
打包基本类型
java中有两个类型系统,基本类型与类类型。基本类型目的在于效率,更多时候会使用类建立实例,因为对象本身可以携带更多信息。让基本类型像对象一样操作,可以使用Long、Integer、Double、Float、Boolean、Byte等类打包(Wrap)基本类型。这些类的主要目的是提供对象实例作为“壳”,将基本类型打包在对象之中,这样就可以操作这个对象,就像是将基本类型当作对象操作。
自动装箱、拆箱
Integer wrapper = 10; //自动装箱
int foo = wrapper; //自动拆箱
wrapper会参考Integer,若被指定给int型的变量foo,则会自动获得打包的int类型在指定给foo。
Integer i1 = 200;
Integer i2 = 200;
System.out.println(i1==i2);
输出结果为:false
当用Integer建立实例时,实际上会使用Integer.valueOf()。
public static Integer valueOf(int i) {
if(i>=IntegerCache.low&&i<=IntegerCache.high)
return IntegerCache.cache[i+(-IntegerCache.low)];
return new Integer(i);
}
如果传入的interesting在Integer.low与Integer.high之间,那就尝试前面缓存(Cache)中有没有打包过相同的值,如果有就直接返回,否则就使用new创建性的Integer实例。Integer.low默认值时-128,Integer.high默认值时127.
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1==i2);
输出结果:true
Integer i1 = 200;
Integer i2 = 200;
System.out.println(i1.equals(i2));
输出结果:true
equals比较的是两个对象实质内容值,i1与i2打包的值相同,所以equals() 比较的结果是true。