scala基本运算02

42 阅读3分钟

内容如下:

1. scala中的位运算符

2. scala中的自增和自减

3. 各种运算的优先级

4. 判断相等

5. 大数问题

(一)Scala的位运算符

10进制转成2进制

image.png

常用的位运算符如下:

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. >> 右移运算符。左边补零,缩小。

[编码演示] 以5,4这个两个数为例画图讲解。

    var a = 5; // 101

    var b = 4  // 100

    println("5 & 4 =" + (5&4) ) // 0

    println("5 | 4 =" + (5|4) ) // 5

    println("5 ^ 4 =" + (5^4) ) // 1  
println("4 >> 2 =" + (4>>2) ) // 1  
println("4 << 2 =" + (4<<2) ) // 16
(二)Scala中运算符的优先级
val result = 10 - 2 + 3 * 4 / 2  
println(result) // 问题1

val a = true  
val b = false  
val c = false  
println(a || b && c) // 问题2

[讲解]基本规则:

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

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

3. && >||

image.png

image.png

(三)Scala的相等性

提问:如何判断两个值相等?

在Scala中,有两种方式:

1. == 比较的对象只有数值,只要==两边的值相等,就返回true。

2. eq 引用比较

[代码讲授]

def main(args: Array[String]): Unit = {  
  var s1 = "hello"  
  var s2 = new String("hello")  
  var s3 = new String("hello")  
  println(s1 == s2) // true  
  println(s1 eq  s3) // false  
}
(四)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)