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()方法的时候,作者也遇到了很多坑,比如在有的编译器上面可以随意的设置保留的小数位数,但不会影响精确结果,以及不限制小数位数的时候结果还是会出现问题比如:

这些当前作者已经阵亡,等之后学会了再附解答链接。

被折叠的 条评论
为什么被折叠?



