您的位置:首页 > 其它

如何验证计算的精度

2008-08-21 17:03 246 查看
简单的动作,直接上代码:

import java.text.DecimalFormat;
import java.math.BigDecimal;

public class test{
public static void main(String[]argv){
double a1=1234567890.0000009;
double a2=9876543210.0000006;
double a3=100.00;
double aa=a1*a2+a3;

DecimalFormat df = new DecimalFormat("#,##0.0000000000");
System.out.println("double:");
System.out.println( df.format(a1)+"*"+df.format(a2)+"+"+df.format(a3)+"="+df.format(aa) );

BigDecimal n1 = new BigDecimal( String.valueOf(a1) );
BigDecimal n2 = new BigDecimal( String.valueOf(a2) );
BigDecimal n3 = new BigDecimal( String.valueOf(a3) );
BigDecimal nn = n1.multiply( n2 ).add( n3 );

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) );

}
}

这段代码不复杂,但,计算的精度,就各有不同。结果,也许是大家都猜不到的。

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

或者,有谁能给出更好的答案来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: