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

最近在接触软件测试,使用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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值