Java编程对于Math里的sqrt与pow的double数据的相等问题——BigDecimal和 DecimalFormat实现

来源:互联网 发布:js判断一个对象的类型 编辑:程序博客网 时间:2024/06/05 01:57

最近在接触软件测试,使用Junit的,目前还是基本的白盒黑盒测试知识,写了一个输入三边判断三角形类型的小程序,发现一个编程易忽略的问题————关于数据格式的,现在整理总结如下:(复制我的代码运行~~)

import java.math.BigDecimal;
import java.text.DecimalFormat;
public class SanJiaoType {
public static void main(String[] args) {
double a=4;
double b=4;
double c=  (4.0*(Math.sqrt(2)));
if((a*a+b*b)==c*c)//不相等
System.out.println("c*c");
if((a*a+b*b)==Math.pow(c, 2))//不相等
System.out.println("Math.pow(c, 2)");
if((a*a+b*b)==(new BigDecimal(Math.pow(c, 2))).doubleValue())//不相等
    System.out.println("(new BigDecimal(Math.pow(c, 2))).doubleValue()");
if((a*a+b*b)==Double.parseDouble((new DecimalFormat(".00").format(Math.pow(c, 2)))))//相等
System.out.println("Double.parseDouble((new DecimalFormat(\".00\").format(Math.pow(c, 2))))~~成功相等");
   if((a*a+b*b)==(new BigDecimal(Math.pow(c, 2))).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue())//相等
    System.out.println("(new BigDecimal(Math.pow(c, 2))).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue()~~成功相等");
   System.out.println("\n各种格式的数据到底等于多少呢??");
   System.out.println((a*a+b*b)+" "
           +(c*c)+" " +Math.pow(c, 2)+" "
       +(new BigDecimal(Math.pow(c, 2))).doubleValue() +" "
+(new BigDecimal(Math.pow(c, 2))).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue()+" "
+Double.parseDouble((new DecimalFormat(".00").format(Math.pow(c, 2)))));
}
}


得到的结果截图:



很清楚的看到用了Math.sqrt(2)的c边的平方要比a*a+b*b大一点点,其中Math.pow(c, 2)与c*c完全一样(包括结果位数等全部),那么问题来了,用了Math.sqrt(2)的c边与a,b边不能验证是等腰直角三角形了吗?

当然不是,当然还是可以验证的,不过我们要注意数据格式了,不注意格式的话绝对会出错。

那么怎么注意数据格式呢?

很简单,看我代码关于 BigDecimal或者DecimalFormat的使用,相信你绝对了解怎么用了吧,此处有几点要说明:

Double.parseDouble(....)是Java将字符串转化为double数据的一种转化方式(有很多种网上查查不难知道);

(new BigDecimal(Math.pow(c, 2))).doubleValue() 不等于new BigDecimal(Math.pow(c, 2)) 不等于(new BigDecimal(Math.pow(c, 2))).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue(),你运行代码很容易知道!


1 0
原创粉丝点击