Scala的位运算符
常用的位运算符如下:
1. & 按位与运算符。0&1 = 0, 1&0= 0 , 0&0 = 0, 1&1 = 1
2. | 按位或运算符。0|1 = 1, 1|0= 1 , 0|0 = 0, 1|1 = 1
3. ^ 按位异或运算符。0^1 = 1, 1^1= 0, 0^0 = 0
4. ~ 按位取反运算符
5. << 左移运算符。右边补零,放大
6. >> 右移运算符。左边补零,缩小
Scala中运算符的优先级
提问: 当存在多个运算符的时候,先算哪个?再算哪个? 基本规则:
1. 乘(*)除(/)模(%) > 加(+)减(-)
2. 算术(+-*/%) > 关系(><>=!=) > 赋值(=)
3. && > ||
如果记不清楚,可以使用()来调整
提问:
val a = true
val b = false
val c = false
println(a || b && c)
(应优先算&&,因为&&优先级大于||)
答案:
true
Scala的相等性
提问:如何判断两个值相等?
在Scala中,有两种方式:
1. == 比较的对象只有数值,只要==两边的值相等,就返回true。
2. eq 引用比较
Scala中的自增和自减运算
在Scala中没有++和--这样的自增和自减运算符。
那么要想在Scala中实现类似于Java中的自增和自减运算,可以使用如下的赋值运算符进行替代。
++:用赋值运算符 +=1代替++。
--:用赋值运算符 -=1代替--。
浮点数精度问题
提问: 0.1 + 0.2 == 0.3 ?
0.1 + 0.2 == 0.3 // false
解释:由于精度的问题,小数的计算会存在误差。
解决方案:使用BigDecimal()函数 编码演示:
println(0.1 + 0.2 == 0.3)
println(BigDecimal(0.1) + BigDecimal(0.2) == BigDecimal(0.3))
拓展:其他语言中也存在这个问题,在掘金上引导同学们去看相关内容文章
大数问题
一种整数都有自己的表达范围,例如Int类型的最大值是2147483647,一旦超过了这个范围就会报错,或者是导致计算异常。
提问:请大家观察如下代码,判断它的输出是多少?
def main(args: Array[String]): Unit = {
var a = 2147483647
var b = 1
var c = (a + b)/2
println(c)
}
答案是:-1073741824,因为1+2147483647 = -2147483648
小技巧:另一种计算平均值的方法: a - (a-b)/2
用BigInt(数字字符串)来解决这个问题。
val a = BigInt("123456789012345678901234567890")
val b = BigInt("987654321098765432109876543210")
println(a + b)
println(a * b)