學習發現 往人少的地方走

Saturday, January 09, 2010

Java double BigDecimal 計算圓周長

直接使用double計算會衍生的小數點不規則問題,

(參考show_double() method )
此篇有較詳細的說明, http://www.ej38.com/showinfo/java-133092.html
因此有BCD碼的產生,
不止Java會發生,其他程式語言對浮點數也會有相同狀況,
(老師應該想讓大家瞭解這樣的情形)
需使用四捨五入或BigDecimal解決幫助使用工程上或科學上運算的問題。

程式如下(仍保留部分原作者原始碼):
半徑與PI值仍是設定double,
回傳圓周長的型態也是double
---------------------------------------------------------------------------
import java.math.BigDecimal;

class M9816104
{
    double pi;
    double radius,width,height;

    double diagonal ()
    {
        return Math.sqrt (width*width+height*height);
    }

    // 新增1
    double perimeter ()
    {
        return radius*2*pi;
    }
 
    // 新增2
    double perimeter (double radius , double pi)
    {
        BigDecimal b1 = new BigDecimal(Double.toString(radius));
        BigDecimal b2 = new BigDecimal(Double.toString(pi));
        return b1.multiply(b2).doubleValue()*2;
    }
   
    void show_perimeter ()
    {
        System.out.println ("圓周長="+(radius*2*pi));
    }

    // 新增3
    void show_double ()
    {
        int i;
        for(i=0;i<5;i++)
        {
           System.out.println(i+"==>"+i*1.1);
        }
        /*            
                        會產出以下結果     
                         0==>0.0
                         1==>1.1
                         2==>2.2
                         3==>3.3000000000000003
                         4==>4.4
        */
    }

    public static void main (String[] X)
    {
        M9816104 test = new M9816104();
        test.radius=5.0;
        test.pi=3.14;
        test.width=4.0;
        test.height=3.0;
       
        test.show_perimeter ();
        System.out.println ("矩型對角線="+test.diagonal());
        System.out.println ("(1)perimeter="+test.perimeter());
        System.out.println ("(2)perimeter="+test.perimeter(test.radius,test.pi));
        test.show_double();
    }
}