如何验证计算的精度

简单的动作,直接上代码:

  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或其它更多的数来,这个在现实生活中,都也是不能接受的。呵 ~

或者,有谁能给出更好的答案来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值