如何验证计算的精度
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或其它更多的数来,这个在现实生活中,都也是不能接受的。呵 ~
或者,有谁能给出更好的答案来
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或其它更多的数来,这个在现实生活中,都也是不能接受的。呵 ~
或者,有谁能给出更好的答案来
相关文章推荐
- 如何计算超出精度数字的加减运算
- JAVA中如何对double或者float的浮点数进行精度计算
- JAVA中如何对double或者float的浮点数进行精度计算
- 浮点数据的精度计算和验证
- 浮点型计算如何确定精度
- [开票专供]Excel 如何避免计算精度与显示精度相差0.01
- 如何在js中精确除法计算并保留两位小数(不丢失精度)java针对于BigDecimal类型
- 关于FFT的一些理解,以及如何手工计算FFT加深理解和验证正确性
- 如何基于MYSQL做实时计算?
- 计时精度到底毫秒级别或者更高 如何使用C#制作一个精确计时器
- SQL 2005如何更改服务器身份验证模式
- STM32中如何计算波特率
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- C语言如何 计算程序运行时间?
- 文件上传如何合理地验证文件类型?
- ERDAS精度评价时如何避免随机生成的样本点落在背景区域
- 如何用XML SCHEMA 验证xml文?
- 如何使用thinkphp 5内置验证功能及自定义验证方法
- 在PC上安装虚拟机进行网络实验。如何规划,进行安装DHCP服务实验。还有dns服务器的验证
- 如何计算冲突域和广播域-图解分析