scala的基本运算2

36 阅读2分钟

scala的位运算符

1 常用运算符:

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

2 scala运算符的优先级

  1. 单目运算符 > 算术运算符(先乘除后加减)。
  2. 关系运算符 > 逻辑运算符(先比较后逻辑判断)。
  3. 逻辑与(&&)> 逻辑或(||) 。
  4. 赋值运算符优先级最低(最后执行)。
  5. 不确定时,用括号 () 强制改变优先级(可读性更高)。

3 scala运算符的相等性

Scala 中用于判断相等性的运算符:

  • ==:值相等性判断(会自动处理 null,比较对象内容而非引用)
  • !=:值不相等判断
  • eq:引用相等性判断(仅用于对象,判断是否为同一实例)
  • ne:引用不相等判断
val x = 5
val y = 5
val z = new Integer(5)

println(x == y)   // true (值相等)
println(x == z)   // true (值相等)
println(x eq z)   // false (不同引用)

注意事项:

  • 位运算符仅适用于整数类型(Byte、Short、Int、Long)
  • == 在比较不同类型时会进行隐式转换(如 Int 和 Long)
  • 对于自定义类,应重写 equals 方法以实现有意义的值相等性判断
  • 位运算的结果可以安全地用于 == 判断,但注意整数溢出问题

4 scala中的自增和自减运算

4.1使用赋值表达式

通过 += 和 -= 操作符配合 1 来实现:

var x = 5
x += 1  // 相当于 x = x + 1,结果为 6
x -= 1  // 相当于 x = x - 1,结果为 5
4.2直接重新赋值

显示写出赋值表达式

var y = 3
y = y + 1  // 自增,结果为 4
y = y - 1  // 自减,结果为 3

5 浮点数精度问题

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

如何处理

5.1 避免直接比较浮点数

不要使用==直接比较浮点数,而应检查它们的差值是否在可接受范围内:

5.2 使用BigDecimal 例如:

import scala.math.BigDecimal
import scala.math.BigDecimal.RoundingMode

val a = BigDecimal(0.1)
val b = BigDecimal(0.2)
val c = a + b

// 设置精度和舍入模式
val result = c.setScale(2, RoundingMode.HALF_UP)
println(result)  // 输出:0.30

6大数问题

Scala 的基本数值类型有固定范围:

  • Byte: -128 到 127
  • Short: -32768 到 32767
  • Int: -2^31 到 2^31-1(约 ±20 亿)
  • Long: -2^63 到 2^63-1(约 ±9 万亿)
6.1如何处理大数问题

使用BigInt处理大整数

BigInt 是处理大数问题的理想选择,它支持任意精度的整数运算,不受常规数据类型的范围限制。