在java中的double和float类型数据相除为啥可以除以零

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java中的double和float类型数据相除为啥可以除以零相关的知识,希望对你有一定的参考价值。

int和long类型为什么不可以,会出现异常?
其他编程语言也是吗?

java中就是这么规定的,没有什么为什么,具体规定如下:

    任意整数(byte、short、int、long皆可)除以整数0结果为ArithmeticException;

    0除以浮点0结果为NAN,细分的话包括以下三种情况:

    (1)0/0.0

    (2)0.0/0.0

    (3)0.0/0

    情况(3)虽然除的是个整数0,但在运算过程中发生了类型转化变成了浮点0;

    任意数(八大基本类型皆可)除以浮点0结果为Infinity/-Infinity。

如果问为什么会这样,可以理解为在java中浮点数0并非一个准确值,而是一个无限接近0的数。

此外,Float.NaN!=Float.NAN,Double.NaN!=Double.NaN;但是Float.POSITIVE_INFINITY==Float.POSITIVE_INFINITY==Double.POSITIVE_INFINITY、

Float.NEGATIVE_INFINITY==Float.NEGATIVE_INFINITY==Double.NEGATIVE_INFINITY。

参考技术A 在JAVA中有三个特殊的浮点类型的数值:正无穷大、负无穷大、NaN

这三种数值用来表示出错或者溢出的情况。

举个例子,用一个正数去除0得到的是正无穷大,而计算负数的平方根会得到NaN本回答被提问者和网友采纳
参考技术B 结果不是无穷大
就是NaN
或者出现异常
其实在计算机中0是以一个很接近0的小数表示的
其他语言会报错的
参考技术C 被0除就会出异常的,你试下就知道了,呵呵
用try,catch语句捕获异常
参考技术D 楼上的说的对 因为 无穷大 的类型是 浮点数

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算。我们先看下面的两个程序代码:

代码一:

import java.util.Scanner;

class Circle {
double radius;
static final double PI=3.14;
public Circle(){this.radius=0;}
public Circle(double r){this.radius=r;}
public double getArea(){return PI*this.radius*this.radius;}
public double getPerimeter(){return 2*PI*this.radius;}
}

public class Cylinder extends Circle {
private double height;
public Cylinder(double r,double h){
this.height=h;
this.radius=r;
}
public double getHeight(){return this.height;}
public double getVol(){return this.height*PI*this.radius*this.radius;}
public void dispVol(){System.out.println("圆柱体的体积:"+this.getVol());}
}

public class Test {

public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入圆的半径以及圆柱体的高:");
double r=input.nextDouble();
double h=input.nextDouble();
Cylinder A =new Cylinder(r,h);
A.dispVol();
}

}

     代码二:我们不修改Circle父类和主函数,我们就改一下子类Cylinder中的getVol()方法的方法体  public double getVol(){return this.height*this.getArea();},从上面的程序我们可以看一下,其实可以理解为达到的程序效果是一样的。

但是我们输入7和6,或是6,5,这两组数据时,我们会发现结果有一定的出入了。

结果如下:

代码一:                                                                      代码二:

请输入圆的半径以及圆柱体的高:                                                 请输入圆的半径以及圆柱体的高:
7                                                                                               7
6                                                                                               6
圆柱体的体积:923.16                                                                 圆柱体的体积:923.1600000000001

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

代码一:                                                                       代码二:

请输入圆的半径以及圆柱体的高:                                                 请输入圆的半径以及圆柱体的高:
6                                                                                              6
5                                                                                              5
圆柱体的体积:565.2                                                                圆柱体的体积:565.1999999999999

 

 为什么会出现以上的结果呢?

             我们可以这么说,浮点数是不适合精确计算的,而适合于科学计算

            举个小例子:1.double a=(1.2-0.4)/0.1;System.out.println(a);2.double a=0.8/0.1;System.out.println(a);这两段代码结果是不同的,第一个结果是7.9999999999999999,第二个结果是8.0。我们都知道,计算机里面数的计算都是二进制计算的,我们其实输入的十进制数,有些十进制数转换成二进制是可以精确转换,而有些转换则不是精确转换,得到的是一个最靠近它的数,所以这里面就存在一个误差。另外,如果浮点数不进行计算时,在十进制里面浮点数能正确显示,如果浮点数参与了计算,那么浮点数二进制与十进制间的转换过程就会变得不可而知,变得不可逆。那么,我们怎样用浮点数来进行精确计算呢?

方法一:Math.round(value*100)/100.0; 如果value为4.015,那么结果保留两位小数为4.01,但是我们心里想的是4.02,因为四舍五入嘛。

方法二:DecimalFormat("0.00").format(4.015);这条代码的结果也是同样的保留两位小数为4.01,并非4.02

方法三:new java.math.BigDecimal(Double.toString(4.015)).setScale(2,java.math.BigDecimal.ROUND_HALF_UP).doubleValue();这条代码的结果同样的是保留两位小数,但是却为4.02,真正的是四舍五入

    关于以上的三个方法的代码,可以参考java API 文档。以上的就是一个JAVA初学者的一点小小的总结,希望大家多点评价和讨论!感谢!

以上是关于在java中的double和float类型数据相除为啥可以除以零的主要内容,如果未能解决你的问题,请参考以下文章

java中两个float数相除,应该是整数却成了小数

numeric 在Java中怎么定义,是啥类型的呢? float?还是double?还是long呢?

关于java中的数据类型

Java中的简单浮点数类型float和double不能够进行精确运算

float和 double类型在java各是多少位啊

float 和 double 数据类型是不是适合存储纬度和经度? [复制]