如何驗證計算的精度

簡單的動作,直接上代碼:

  1. import java.text.DecimalFormat;
  2. import java.math.BigDecimal;
  3. public class test{
  4.     public static void main(String[]argv){
  5.         double a1=1234567890.0000009;
  6.         double a2=9876543210.0000006;
  7.         double a3=100.00;
  8.         double aa=a1*a2+a3;
  9.         
  10.         DecimalFormat df = new DecimalFormat("#,##0.0000000000"); 
  11.         System.out.println("double:");
  12.         System.out.println( df.format(a1)+"*"+df.format(a2)+"+"+df.format(a3)+"="+df.format(aa) );
  13.       
  14.         BigDecimal n1 = new BigDecimal( String.valueOf(a1) );
  15.         BigDecimal n2 = new BigDecimal( String.valueOf(a2) );
  16.         BigDecimal n3 = new BigDecimal( String.valueOf(a3) );
  17.         BigDecimal nn = n1.multiply( n2 ).add( n3 );
  18.         
  19.         System.out.println("BigDecimal 1:");
            System.out.println( df.format(n1)+"*"+df.format(n2)+"+"+df.format(n3)+"="+df.format(nn) );
            
            n1 = new BigDecimal( "1234567890.0000009" );
            n2 = new BigDecimal( "9876543210.0000006" );
            n3 = new BigDecimal( "100.00" );
            nn = n1.multiply( n2 ).add( n3 );
            
            System.out.println("BigDecimal 2:");
            System.out.println( df.format(n1)+"*"+df.format(n2)+"+"+df.format(n3)+"="+df.format(nn) );
           
  20.     }
  21. }

這段代碼不復雜,但,計算的精度,就各有不同。結果,也許是大家都猜不到的。


  1. double:
    1,234,567,890.0000010000*9,876,543,210.0000000000+100.0000000000=12,193,263,111,263,537,000.0000000000
    BigDecimal 1:
    1,234,567,890.0000010000*9,876,543,210.0000000000+100.0000000000=12,193,263,111,263,536,876.5432100000
    BigDecimal 2:
    1,234,567,890.0000009000*9,876,543,210.0000006000+100.0000000000=12,193,263,111,263,536,629.6296230000

程序的環境是JDK1.5 +Windows XP SP3

不知道哪個結果會更符合我們的要求了。小數位的後面7、8位有數,省略掉,對於現實生活來講,是可以的。雖然在科學計算中是不行的。

但,創造出 0.54321或其它更多的數來,這個在現實生活中,都也是不能接受的。呵 ~

或者,有誰能給出更好的答案來
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章