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初学者的一点小小的总结,希望大家多点评价和讨论!感谢!

时间: 2024-10-21 15:26:25

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

Java中的简单工厂模式

举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色. 2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象的人是最早只存在于女娲的头

Java中的简单工厂模式(转)

Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思想里面,有几个重要的角色:女娲本身.抽象的人的概念和女娲所造出的一个个具体的人. 1.)女娲是一个工厂类,也就是简单工厂模式的核心角色. 2.)具休的一个个的人,包括张三,李四等.这些人便是简单工厂模式里面的具体产品角色 3.)抽象

Java中出现的异常类型

Java中出现的异常类型     失踪的格式参数异常 java.util.MissingFormatArgumentException异常 错误提示信息: java.util.MissingFormatArgumentException:Format specifier 's' 原因:字符串格式化提供的值的数量少于字符串格式符(%s)的数量 参数:  format - 在格式字符串的语法中描述的格式字符串  args - 格式字符串中的格式说明符引用的参数.如果参数多于格式说明符,则忽略额外的参

为啥在java中不要使用char类型

背景 最近项目中遇到一个问题,反复测试才发现问题出在了数据库中,由于使用了 Hibernate 这种ORM框架,因此,在java中写的 EntityBean 就可以直接通过ORM映射到Oracle数据库了,这也导致了很多的问题.当然,查了很多的资料,最终解决了这个问题,并且对Oracle的数据类型也有了一个更深层次的理解.下面是我的译文(原文是英文版的). 译文 要理解char类型,您首先必须了解Unicode编码模式.Unicode的发明克服了传统的字符编码方案的局限性.在Unicode出现之

java中特殊的String类型

Java中String是一个特殊的包装类数据有两种创建形式: String s = "abc"; String s = new String("abc"); 第一种先在栈中创建一个对String类的对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值 'a'.'b'.'c',然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{'a'.'b'. 'c'

java中最简单的计算执行时长的方式

日常在做一些性能测试的时候会通过执行时间来判断执行时长,java中最简单的方式如下: //开始时间 long startL= new Date().getTime(); //这里需要导入 java.util.*;包 exceFun(); long endL= new Date().getTime(); //执行时间 System.out.println("startL:"+senStrat +" endL:"+senEndL +" 执行时长:"

Java中包装类型和基本类型的使用场景(什么时候使用包装类型)(转)

说明:最简单的理解,基本类型有默认值,而包装类型初始为null.然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型. Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. 1.整数:包括int.short.byte.long初始值为0. 2.浮点型:float.double初始值为0.0 3.字符:char初始值为空格,即'' ",如果输出,在Console上是看不到效果的. 4.

Java中常见的对象类型简述(DO、BO、DTO、VO、AO、PO)(转)

原文:https://blog.csdn.net/uestcyms/article/details/80244407 题记 编写本篇文章的缘由是阿狸JAVA开发手册多处提到DO.BO.DTO.VO.PO等概念: 内容多引用于网络帖子上的回答,如下: 知乎:PO BO VO DTO POJO DAO DO这些Java中的概念分别指一些什么? CNblogs:PO BO VO DTO POJO DAO概念及其作用(附转换图) 概念及理解 这些概念用于描述对象的类型:由于java是面向对象的语言:程序

Java练习 SDUT-1959_简单枚举类型——植物与颜色

简单枚举类型--植物与颜色 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 请定义具有red, orange, yellow, green, blue, violet六种颜色的枚举类型color,根据输入的颜色名称,输出以下六种植物花朵的颜色: Rose(red), Poppies(orange), Sunflower(yellow), Grass(green), Bluebells(blue), Violets(v