Java中“/”的使用


前言

在做实验的时候遇到了关于Java中“/ ”的一些问题,具体涉及到Java中‘/’的用法,以及在除法中遇到的精度问题

一、Java中怎么进行“/”操作

在Java学习过程中,我们最先对”/”的印象是取整计算,“%”是取余计算。比如

public class test {
	public static void main(String[] args) {
		int a = 1;
		int b = 3;
		int c  = (a*b)/2;
		System.out.println(c);		
	}
}

这时我们能看到输出的结果是:1,显然,我们使用“/” 在这里是做了取整操作。那么当我们面对浮点型数据或者double型数据的时候,我们需要取整操作一般情况是:先将double或float型数据更改为int型数据,然后再进行计算:

public class test {
	public static void main(String[] args) {
		float a = (float) 4.5;
		float b = (float) 5.7;
		int c  = (int)((a*b)/2);
		System.out.println(c);		
	}
}

这里结果输出是12.
(这里有一个问题:就是在输入小数的时候,计算机似乎会默认输入的小数是double类型的,所以这里在定义成float类型的时候就需要进行数据类型转换。但具体原因没有理解透彻,这里只是一个猜测,暂时保留,以后看明白这个问题了再来进行修改)。

二、在计算商的时候获得一个确切的结果而不是取整。

比如我们计算 (4.5 * 5.7)/ 2的结果:

public class test {
	public static void main(String[] args) {
//		float a = (float) 4.5;
//		float b = (float) 5.7;
//		int c  = (int)((a*b)/2);
//		System.out.println(c);	
		
		double d = (4.5 * 5.7)/2;
		System.out.println(d);
		
		float e = (float) ((4.5*5.7)/2);
		System.out.println(e);
	}
}

通过测试上面的代码可以看到,我们在分别取float和取double类型的时候,可以获得一个准确的商:
在这里插入图片描述
但是,在这里你会发现一个很奇怪的事情,那就是使用double类型和使用float类型我们获得的结果精度是不同的。
通过计算器计算,其实正确的结果应该是12.825.那么为什么在double类型时,结果出现错误?
这一问题涉及到在浮点数运算会存在精度问题,这和计算机浮点数的表示有关。所以一般情况下我们在Java中做除法运算,期望获得一个准确的结果的时候,建议使用如下操作:

	public static void main(String[] args) {
//		float a = (float) 4.5;
//		float b = (float) 5.7;
//		int c  = (int)((a*b)/2);
//		System.out.println(c);	
		
//		double d = (4.5 * 5.7)/2;
//		System.out.println(d);
//		
//		float e = (float) ((4.5*5.7)/2);
//		System.out.println(e);
		
//		BigDecimal b1 = new BigDecimal(4.5);
//		BigDecimal b2 = new BigDecimal(5.7);
		
		System.out.println(new BigDecimal(4.5 * 5.7).divide(new BigDecimal(2),3,BigDecimal.ROUND_HALF_UP));
		
	}
}

总结

以上就是在学习过程中突然发现的关于java中除法的一些坑,虽然解决了一部分问题,但是还有一部分的问题没有解决,比如:
1、在浮点数运算会存在精度问题,这和计算机浮点数的表示有关
在这里猜测估计是涉及到计算机组成原理中浮点数的表示原理,这里等深入研究后在做解答。
2、在使用Java.math.BigDecimal.divide()方法的时候,作者也遇到了很多坑,比如在有的编译器上面可以随意的设置保留的小数位数,但不会影响精确结果,以及不限制小数位数的时候结果还是会出现问题比如:
在这里插入图片描述
这些当前作者已经阵亡,等之后学会了再附解答链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值