java数值运算

1. 整型等值判断

Java中整型等值判断方法如下表所示:

类型整型数值范围区间创建方式是否复用已有对象等值判断
Integer[-128, 127]IntegerCache.cache复用已有对象equals方法 或 ==
Integer[-128, 127]区间外,整型数值范围内在堆上创建不复用已有对象equals方法
int整型数值范围内在栈上创建——==

示例:

@Test
public void test() {
 Integer num1 = 10;
 Integer num2 = 10;
 Integer num3 = new Integer(10);
 Integer num4 = new Integer(10);
 Integer num5 = 1000;
 Integer num6 = 1000;
 System.out.println(num1 == num2);
 System.out.println(num3 == num4);
 System.out.println(num5 == num6);
}

结果:
在这里插入图片描述
分析:

  • num1与num2使用都是直接将整型数值赋值给包装类,并且整型数值在[-128, 127]之间,使用IntegerCache.cache创建对象,可以复用已有对象,因此可以使用 == 进行等值判断。
  • num3与num4是通过构造方法new出来的对象(该过程在堆中进行),因此它们的地址是不一样的,所以不能使用 == 进行等值判断。
  • num5与num6使用都是直接将整型数值赋值给包装类,但是整型数值在[-128, 127]区间之外,在堆上创建对象,不复用已有对象,因此不能使用 == 进行等值判断。

总结:

  • 由于使用Integer包装类的具体场景中经常无法判断其具体取值区间,因此建议Integer类型的等值判断采用equals方法。
2. 浮点型数值运算

由于浮点型在参与数值运算时存在精度损失,因此浮点型运算一律转为BigDecimal类型进行计算。

示例:

/**
 * 计算3.14 * 2.2
 * */
@Test
public void test() {
    // 使用double运算,打印结果:6.908000000000001
    System.out.println(3.14d * 2.2d);
    // 使用BigDecimal运算,打印结果:6.908
    System.out.println(new BigDecimal("3.14").multiply(new BigDecimal("2.2")));
}

分析:使用double直接运算的结果存在一定误差,而使用BigDecimal运算的结果为精确值。


BigDecimal的创建方式:

  • 错误创建方式

    // 不能在bigDecimal的构造方法里直接传入double或float类型的变量或数值,这样创建的BigDecimal对象本身存在误差
    BigDecimal bigDecimal = new BigDecimal(3.14d);
    // 打印结果:3.140000000000000124344978758017532527446746826171875
    System.out.println(bigDecimal);
    
  • 正确创建方式

    // 可以在bigDecimal的构造方法里传入浮点类型的字符串
    BigDecimal bigDecimal1 = new BigDecimal("3.14");
    BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(3.14d));
    
    // 可以使用BigDecimal的静态方法valueOf()传入浮点型数值来创建
    BigDecimal bigDecimal3 = BigDecimal.valueOf(3.14d);
    
3. 浮点型等值判断

浮点型等值判断分以下类型:

  • 参与比较的两个浮点数 num1 与 num2 只包含整数部分,不包含小数部分时,可以直接使用 == 或其装箱类的equals方法进行等值判断。

  • 当参与比较的两个浮点数 num1 与 num2 的数值中包含小数部分时,有两种方式进行等值判断。

    1、判断两个浮点数 num1 与 num2 是否等值,当 num1 - num2 的绝对值在某一精度范围内时,可以认为 num1 与 num2 是等值的。

    示例:

    /**
     * 判断num1是否等于3.14
     * */
    public boolean test(double num) {
        if (Math.abs(num - 3.14d) < 1e-10d){
            return true;
        } else {
            return false;
        }
    }
    

    2、判断两个浮点数 num1 与 num2 是否等值,可以先将 num1 与 num2 转换为BigDecimal类型,在进行比较。

    示例:

    /**
     * 判断num1是否等于3.14
     * */
    public boolean test7(double num) {
        BigDecimal bigDecimal = BigDecimal.valueOf(num);
        if (bigDecimal.equals(new BigDecimal("3.14"))) {
            return true;
        } else {
            return false;
        }
    }
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值