Scala的基本运算

81 阅读3分钟

算术运算符

%: 计算余数。 5%2 就是 5除以2的余数, 5%2 = 1

// 算术运算符

// 数据类型。7:Int
//          4:Int
//          7/4结果是Int
println(7/4)  // 7/4 = 1

println(7/4.0)  // 7/4 = 1
println(7 % 4)  // 3
println(7 - 4)  // 3
println(7 + 4)  // 11
println(7 * 4)  // 28

注意: 7/4 = 1,7/4.0 = 1.75。原因是:参与运算的数字 “数据类型”(整数 / 浮点数)决定了运算逻辑。

关系运算符

代码示范:

== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

// 关系运算符: > < == >= !=
// false ture

val a:Boolean = 3 > 2

println(a)
println(7==4)  // false
println(7>4)   // ture
println(7!=4)  // ture
println(7<4)   // false
println(7>=4)  // ture
println(7<=4)  // false

逻辑运算符

    // 逻辑运算符
    /*
      &&(并且)  全部为true ===> true
      ||(或者)  有一个为true ===>true
      ! (取反)
     */

    println( 1 > 2 && 3 > 4)
    println( 2 > 1 && 4 > 3)
    println( 1 > 2 || 3 > 4 || 5 > 6) //false
    println( 1 > 2 || 4 > 3) //true

    println( !(1>2) ) //true

练习

判断一个年份是否是闰年 根据国际标准,一个年份被视为闰年的条件是,如下条件满足任意一个: (1)能够被4整除,并且不能被100整除的年份是闰年。 (2)能够被400整除的年份同样也是闰年。

object base09 {
  def main(args: Array[String]): Unit = {
    // 判断闰年
    /*
    1. 让用户输入一个整数,表示年份
    2. 判断这个年份是否是闰年
    3. 输出结果
    */
    val year: Int = scala.io.StdIn.readInt()
    // 2000 ===> 2000是闰年
    // 2024 ===> 2024是闰年
    // 2025 ===> 2025不是闰年
    // 1900 ===> 1900不是闰年

    // 如果你定义了一个变量,并且之后并不打算修改它的值,那么建议使用val
    var result: Boolean = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)

    if (result) {
      println(s"$year 是闰年")
    } else {
      println(s"$year 不是闰年")
    }
  }
}

赋值运算符

= 简单的赋值运算,指定将右边操作数赋值给左边的操作数
+= 相加后再赋值,将左右两边的操作数相加后再赋值给左边的操作数
-= 相减后再赋值,将左右两边的操作数相减后再赋值给左边的操作数
*= 相乘后再赋值,将左右两边的操作数相乘后再赋值给左边的操作数
/= 相除后再赋值,将左右两边的操作数相除后再赋值给左边的操作数
%= 求余后再赋值,将左右两边的操作数进行求余操作后再赋值给左边的操作数

示例:

object base10 {
  def main(args: Array[String]): Unit = {
    // 赋值运算符

    var a = 1 // 把右边的运算结果保存到左边的变量里

    a += 2 // a+=2 等价于 a = a+2
    println(a) // 3

    a -= 3 // a-=3 等价于 a=a-3
    println(a) // 0

    a *= 3
    println(a) // 0

    a /= 4
    println(a) // 0

    a %= 5
    println(a) // 0
  }
}

位运算符

常用的位运算符如下:

& 按位与运算符。0&1 = 0,  1&0= 0 , 0&0 = 0, 1&1 = 1
| 按位或运算符。0|1 = 1,  1|0= 1 , 0|0 = 0, 1|1 = 1
^ 按位异或运算符。0^1 = 1,  1^1= 0, 0^0 = 0
~ 按位取反运算符
<< 左移运算符。右边补零,放大。
>> 右移运算符。左边补零,缩小。

示例:

class base11 {
  def main(args: Array[String]): Unit = {
    // 位运算
    println(5 & 4)
    println(5 | 4) // 5

    println(4<<2) // 16
    println(4>>2) // 1
  }
}

运算符的优先级

基本规则:

1. 乘(*)除(/)模(%) > 加(+)减(-)

2. 算术(+-*/%) > 关系(><>=!=) > 赋值(=)

3. && > ||

如果记不清楚,可以使用()来调整。

示例:

object base12 {
  def main(args: Array[String]): Unit = {
    val result = 10 - 2 + 3 * 4 / 2
    println(result) // 问题1
    val a = true
    val b = false
    val c = false
    println(a || b && c) // 问题2
  }
}

答案:
14
true

浮点数精度问题

object base13 {
  def main(args: Array[String]): Unit = {
    // 精度
    val a = 0.1 + 0.2 == 0.3 // false
    val b = 0.2 + 0.2 == 0.4
    val c = BigDecimal(0.1) + BigDecimal(0.2) == BigDecimal(0.3)
    println(a) //false
    println(b)
    println(c)
  }
}

答案:
false
true
true