Scala所有的数值都是对象,包括Byte、Char、Double、Float、Int、Long和Short,与被称为"非数值类型"的Unit和Boolean一样,这些数值类型都继承扩展自AnyVal特质(trait)
内奸数值类型的数值范围:
- Char :16位无符号Unicode字符
- Byte :8位有符号整数
- Short :16位有符号整数
- Int :32位有符号整数
- Long :64位有符号整数
- Float :32位IEEE 754单精度浮点数
- Double :64位IEEE 754双精度浮点数
Boolean型
复数:
Scala自带的math库,或者了解Spire和ScalaLab
日期类型:
nscala-time对Java的Joda Time进行了封装
2.1从字符串到数值
- s1.toInt / s1.toDouble ····
如果字符串s1不是阿拉伯数字型字符,那么会抛出异常 - Integer.parseInt(“num”,n进制)
可以返回一个n进制的num - 创建隐式转换类和方法
implicit class StringToInt(s:String) {
def toInt(radix: Int) = Integer.parseInt(s,radix)
}
2.2数值类型转换
- num.to[Type]
Type:基本数据类型
2.3重载默认数值类型
- val a = 1d / val a = 1f / val a = 100L
分别对应类型Double、Float、Long - 给变量增加类型声明
val a = 0: [Type] 或
val a [Type] = 0
val a = 0: Byte
val a = 0: Int
val a: Double = 0
val a: Float = 0
- 进制前缀
十六进制保存
val a = 0x20
2.4替代++和- -
即Scala中不存在++ , - -这种运算符或者语句
- 用+=1,-=1替代++和- -
其实这里所有的算数运算符,+=,-=,*=和/=都不是操作符而是方法。这种把功能实现为方法而非操作符的方式是Scala里的一贯的模式,在Scala里,函数(方法)是"一等公民"
2.5浮点数的比较
由于浮点数的运算会产生误差,比如:0.1+0.3可能等于0.400000000003
这就会导致当a = 0.1, b = 0.3 ,c = a + b,判断 a + b == c的结果会是false,为了消除这种误差,可以自定义隐式方法(在工具对象上或者包对象中)
object MathUtils {
def ~=(x: Double, y: Double,precision: Double) = {
if ((x - y).abs < precision) true else false
}
}
然后使用这个对象中的这个方法来进行判断
println(MathUtils.~=(a+b,c,0.00001))
2.6处理大数
- BigInt()类
参阅:Java的BigInteger类,Scala的BigInt类和BigDecimal类
2.7生成随机数
- scala.util.Random类
scala> val r = scala.util.Random
r: util.Random.type = scala.util.Random$@5a14e60d
scala> r.nextInt
res0: Int = 1856103164
scala> r.nextInt(100) //选取范围在(0,99)之间
res1: Int = 51
scala> r.nextDouble
res2: Double = 0.6855927466475535
详情参阅Random类
2.8创建一个数值区间、列表或者数组
- a1 to a2
a1要小于a2,生成一个Range(a1,·····,a2) 默认步长为1 - a1 to a2 by 步长
- a1 until a2
不包含a2 - (a1 to a2).to[CollectionType]
会将本来一个Range型的容器转换成CollectionType的,例如List,Array,Tuple等
2.9格式化数值和金额
- 1.4节所描述的内容解释f字符串
- “xxx占位符xx”.format(param)
具体参考上网搜索或者参考相关资料