基本运算

69 阅读4分钟

算术运算符

在Scala中,运算符实际上是方法的另一种表现形式。Scala中的运算符即方法,方法即运算符。这意味着运算符的使用实际上是隐含地调用对应的方法。

屏幕截图 2025-09-10 150933.png

println(10/3)  //    Int/Int,结果还是Int 3

println(10/3.0)  //   Int/Double,结果还是Double 3,33333333


println(10%2)   //  10/2的余数 0
println(10.5%3.0)   //  10.5/3的余数 1.5

关系运算符

屏幕截图 2025-09-10 151321.png

//关系运算符
var b: Boolean = 1 == 1


println(b)        //true
println(1 != 2)   //true
println(1 > 2)    //false
println(1 < 2)    //true
println(1 >= 2)   //false
println(1 <= 2)   //true

逻辑运算符

用于连接多个条件(一般来讲就是关系表达式),最终的结果也是一个 Boolean 值。假定:变量 A 为 true,B 为 false

Scala中的逻辑运算跟Java中一样,也是与、或、非三种情况,具体如下。

· 与:&& 运算表达式有一个为假,则整个表达式为假false。

· 或:|| 运算表达式有一个为真,则整个表达式为真true。

· 非:! 就是取反的意思,与参与表达式相反。

//逻辑运算符
  println(1>2 && 2>1)    //false

  println(3<5 || 5>3)    //true

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

短路运算

短路运算的核心思想是:由&&或||这两个运算符构建出来的表达式,只会对整个运算结果有决定作用的部分进行求值

Scala的短路运算法则:result=表达式1 运算符 表达式2

· 运算符为&&时:如果表达式1为false,则result=false,也就是说此时表达式1能够决定整个与运算的值,因此不会再去求表达式2的值。

· 运算符为||时:如果表达式1为true,则result=true,也就是说此时表达式1能够决定整个或运算的值,因此不会再去求表达式2的值。

object basic7 {
  def main(args: Array[String]): Unit = {

    def f()  :Boolean = {
      println("f")
      false
    }

    1 > 2 && f()  //false
    // 2 > 1 && f()

    2 > 1 || f()  //true
  }
}

Scala的赋值运算符

= 简单的赋值运算,指定将右边操作数赋值给左边的操作

+= 相加后再赋值,将左右两边的操作数相加后再赋值给左边的操作数

-= 相减后再赋值,将左右两边的操作数相减后再赋值给左边的操作数

*= 相乘后再赋值,将左右两边的操作数相乘后再赋值给左边的操作数

/= 相除后再赋值,将左右两边的操作数相除后再赋值给左边的操作数

%= 求余后再赋值,将左右两边的操作数进行求余操作后再赋值给左边的操作数

var a += 1
printfln( a )

Scala的位运算符

常用的位运算符如下:

1. & 按位与运算符。0&1 = 0,  1&0= 0 , 0&0 = 0, 1&1 = 1 (只要有0结果就是0)

2. | 按位或运算符。0|1 = 1,  1|0= 1 , 0|0 = 0, 1|1 = 1 (只要有1结果就是1)

3. ^ 按位异或运算符。0^1 = 1,  1^1= 0, 0^0 = 0 (同是0,异是1)

4. ~ 按位取反运算符

5. << 左移运算符。右边补零,放大。

6. >> 右移运算符。左边补零,缩小。

object basic9 {
  def main(args: Array[String]): Unit = {
    var a=5;
    var b=4
    println("5 & 4=" + (5&4))
    println("5 | 4=" + (5|4))
    println("5 ^ 4=" + (5^4))
    println("4 >> 2=" + (4>>2))
    println("4 << 2=" + (4<<2))
  }

}

Scala中运算符的优先级

基本规则:

1. 乘除模 > 加减

2. 算术 > 关系 > 赋值

3. && > ||

val a = true
val b = false
val c = false
println(a || b && c)  //true
//先算&& 后算||
println((a || b) && c)  //false

浮点数精度问题

由于精度的问题,小数的计算会存在误差。

 var a = 0.1
    var b = 0.2
    var c = 0.3

    println(a + b ==c)  //false

//    BigDecimal:处理浮点数精度问题
    println(BigDecimal(a) + BigDecimal(b) == BigDecimal(c)) //true

大数问题

一种整数都有自己的表达范围,例如Int类型的最大值是2147483647,一旦超过了这个范围就会报错,或者是导致异常。

// 大数问题
    var a = 2147483647
    var b = 1

    println(a+b)
//    ab都是Int类型,所以a+b的结果也是Int类型
//    Int类型最大值是2147483647
//    2147483647 + 1 = -2147483647


    //计算它们的平均数
    var c = (a+b)/2  //-1073741824
    var d = a - (a-b)/2  //1073741824
    println(c)
    println(d)

用BigInt(数字字符串)来解决这个问题。

val a = BigInt("123456789012345678901234567890")
val b = BigInt("987654321098765432109876543210")
println(a + b) //1111111110111111111011111111100
println(a * b) //121932631137021795226185032733622923332237463801111263526900