Java学习笔记(二)BigDecimal的使用、对象指定与相等性、打包基本类型

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值