日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2025/5/22 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的Java中的简单浮点数类型float和double不能够进行精确运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。