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

转载于:https://www.cnblogs.com/weihao950903/p/5335279.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值