Scala实战专栏 (二) ——— 数值

本文介绍了Scala中的数值处理方法,包括数值类型转换、大数处理、随机数生成等,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scala-basic 基础篇

@author 鲁伟林
Scala基础知识介绍,主要包括《Scala编程实战》的基础章节

GitHub地址: https://github.com/thinkingfioa/scala-in-action
本人博客地址: http://blog.youkuaiyun.com/thinking_fioa/article/details/78265745

第2章 数值

第2章项目源码阅读

引言

Scala所有的数值都是对象,包括Byte、Char、Double、Float、Int、Long和Short。其数值类型范围与Java的基本数据类型范围相同。

2.1 从字符串到数值

把一个字符串转换成一个Scala的数值类型。

  • 使用String的to*方法。eg: val age : Int = "19".toInt
  • BigInt和BigDecimal类型的数值也可以通过字符串创建。eg: val b : BigDecimal = BigDecimal("3.1415926")
  • String中的toInt方法不支持传入进制,所以采用java.lang.Integer类的parseInt方法。 eg: Integer.parseInt("10", 2);

代码:

object Number2P1 {

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

    val str : String = "111"

    val num : Int = str.toInt
    println(num)

    println(str.toInt2(2))
    println(Integer.parseInt(str, 2))

  }

  implicit class StringToInt(str: String) {
   def toInt2(radix : Int) : Int = Integer.parseInt(str, radix)
  }
}

2.2 数值类型转换

把一个数值类型转换成另一种数值类型,如把Int类型转换成Double类型。在Scala中,不可以直接进行强制类型转换,使用在所有数值类型上都可用的to*方法。eg: 19.45.toInt

  • 为了避免类型转换可能出现错误,在转换前可以使用相应的isValid方法确认是否可以进行类型转换。eg: a.isValidShort,如果超过了数值类型,也会返回false

2.3 重载默认数值类型

对一个数值类型变量赋值时,Scala会自动把数值类型赋值给变量. eg: val a =1d, a的类型则是Double。另一个方案是: val b = 0: Double, b的类型则是Double

2.4 替代 ++ 和 --

像其他语言里那样使用++和--来递增或者递减一个变量,但是Scala里没有这样的操作符。需要使用+=、-=、*=和/=方法来实现递增。eg: a +=1 

2.5 浮点数的比较

比较两个浮点数的值,与其他语言一样,两个应该相等的浮点数有可能实际上是不等的

代码:

object Number2P5 {

  def main(args: Array[String]): Unit = {
    val d3 = 0.3d
    val addDouble : Double = sumDouble(0.2d, 0.1d)
    println(s" $d3 != $addDouble")
    println(~=(d3, addDouble, 0.000001))
  }

  /**
    * 输出 0.30000000000000004
    */
  def sumDouble(d1 : Double, d2 : Double) : Double = {
    d1 + d2
  }

  def ~=(x: Double, y:Double, precision: Double): Boolean = {
    if((x-y).abs < precision) {
      true
    } else {
      false
    }
  }
}

2.6 处理大数

编写一个处理非常大的整数的程序,在Scala语言中可以使用BigInt和BigDecimal类。eg: var b = BigDecimal(123456789.12345678)

2.7 生成随机数

使用Scala的Scala.util.Random生成随机数. eg: val random = new Random()

  • random.nextInt ----- 返回一个Int范围的随机数
  • random.nextInt(100) ----- 返回一个0到99的随机数
  • random.nextFloat ----- 返回一个0.0 到 1.0的随机数

代码:

object Number2P7 {

  def main(args: Array[String]): Unit = {
    println(random(100))

    randomMore(6)
  }

  def random(upper : Int) : Int = {
    val random = new Random()
    random.nextInt(upper)
  }

  def randomMore(count : Int) : Unit = {
    val random = new Random(System.currentTimeMillis())
    for(i <- 1 to 10) yield println(random.nextInt(100))
  }
}

2.8 创建一个数值区间、列表或者数组

在for循环里或者为了测试创建一个数值区间、列表或者数组

  • var r = 1 to 10 ------ 得到Range(1, 2, 3,..., 10)
  • var r = 1 until 5 ------ 得到Range(1, 2, 3, 4)
  • var r = 1 to 10 by 2 ----- 得到Range(1, 3, 5, 7, 9)
  • for(c <- 1 until 5) println(i)
  • val x = (1 to 10).toArray/toList ----- 快速生成列表和数值

2.9 格式化数值和金额

对数值或者金额的小数位数或逗号进行格式化,特别是输出时,非常有用

  • 基本数值的格式化输出 ----- eg: "f%pi%1.5f",表示整数位1位,小数位5位
  • 简单的加逗号 ----- java.text.NumberFormat.getIntegerInstance

代码:

object Number2P8 {

  def main(args: Array[String]): Unit = {
    // 输出: 10,000,000
    System.out.println(printF(10000000))
  }

  def printF(money : Long ) : String = {
    val formatter = java.text.NumberFormat.getIntegerInstance()
    formatter.format(money)
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值