core java 学习笔记(2)

本文探讨Java中浮点数的表示与运算问题,包括double类型计算误差的原因及解决方法,通过BigDecimal类实现精确计算,并介绍strictfp关键字的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

core java 第三章-----java基本程序结构设计

1.1        java规定了八种基本数据类型,byte,short,int ,long,float,double,char,boolean,其中long类型以L作后缀,float类型以F作后缀,若不添加F作为后缀,则默认为double类型。对double类型的计算可能会存在误差,如下:
import java.math.BigDecimal;

class  TestDemo2

{

	public static void main(String[] args) 

	{

		double i=1.2;

		double j=1.1;

		System.out.println(i+j);		

		System.out.println(i-j); //存在误差		

		System.out.println(i*j);		

		System.out.println(i/j); //存在误差

		

	}

}---------- java解释器 ----------

2.3

0.09999999999999987

1.32

1.0909090909090908



输出完毕 (耗时 0 秒)
为什么会出现是上面的这种情况呢?主要是因为浮点数在计算机中是以二进制表示的,而在二进制中是无法去精确计算十进制小数的。如果想精确计算,可使用BigDecimal类。如下:
import java.math.BigDecimal;

class TestDemo4 

{

	public static void main(String[] args) 

	{

		double i=1.2;

		double j=1.1;

		BigDecimal bd1=BigDecimal.valueOf(i);

		BigDecimal bd2=BigDecimal.valueOf(j);

		BigDecimal bd3=new BigDecimal(0.0);

		bd3=bd1.add(bd2); //加

		System.out.println(bd3);

		bd3=bd1.subtract(bd2); //减

		System.out.println(bd3);

		bd3=bd1.multiply(bd2); //乘

		System.out.println(bd3);

		bd3=bd1.divide(bd2,5,BigDecimal.ROUND_HALF_DOWN ); //除,除不尽是调用此方法,否则抛出异常

		System.out.println(bd3);

	}

}

---------- java解释器 ----------

2.3

0.1

1.32

1.09091



输出完毕 (耗时 0 秒)
1.2 strictfp 为了得到较为理想的结果,可以使用strictfp关键字,用法如下:
import java.math.BigDecimal;

class  TestDemo2

{

	public static strictfp void main(String[] args) 

	{

		double i=1.2;

		double j=1.1;

		System.out.println(i+j);		

		System.out.println(i-j); //存在误差		

		System.out.println(i*j);		

		System.out.println(i/j); //存在误差

		

	}

}
加入strictfp关键字后可以产生较为理想的结果,注意,只是理想结果,而不是结确结果。对大多数的程序设计人员来说,浮点溢出不是什么大问题,可忽略此问题。
1.3 运算符
逻辑运算符:&&(逻辑与),||(逻辑或)
位运算符:&(与),|(或),^(异或),~(非)
移位运算符:>>(右移),<<(左移),>>>(无符号右移)
注意:不存在无称号左移,只能对整型数据进行移位操作
对移位运算符右侧的参数要进行模32的运算,左侧的参数是long要进行模64的运算,如下:
class TestDemo3 

{

	public static void main(String[] args) 

	{

		int m=2;

		System.out.println(m>>3);//取模32

		byte n=10;

		System.out.println(n<<32); //取模32

		long l=110L;

		System.out.println(l<<64);//取模64

		System.out.println(l<<3);

		System.out.println(l<<67);

		double d=1.234;

		//System.out.println(d<<64);  只能对整型进行移位操作

	}

}

---------- java解释器 ----------

0

10

110

880

880



输出完毕 (耗时 0 秒)
可以看出,将long类型右移3位与右移67位最后得到的结果是相同的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值