算术运算符
在Scala中,运算符实际上是方法的另一种表现形式。Scala中的运算符即方法,方法即运算符。这意味着运算符的使用实际上是隐含地调用对应的方法。
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
关系运算符
//关系运算符
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)
// a和b都是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