目录
数值类型自动转换
当 Scala 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:
说明
- 自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
- 把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
- byte,short)和 char 之间不会相互自动转换。
- byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
package com.mingyu.spark.core.test
object TestTransform {
def main(args: Array[String]): Unit = {
// 自动类型转换
var t1: Int = 290
// 1 大转小会报错
//var t2:Byte = t1 // error
// 2 小转大会转化为大的进行计算
var t3: Double = 1.0
t3 = t1
println(t3.getClass.getSimpleName) // double
// 3 (Byte,Short)和 Char 之间不会相互自动转换
var t4: Byte = 1
var t5: Char = 1
var t6: Short = 32
//t5 = t4 // error
//t6 = t5 // type mismatch
// 4 byte,short,char 他们三者可以计算,在计算时首先转换为 int
//类型。
//t6 = t4 + t5 // (t4 + t5)结果是Int,大转小报错
//var t7:Short = 1+1 //大转小 报错
}
}
数值类型强制转换
自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意
Java : int num = (int)2.5
Scala : var num : Int = 2.7.toInt
- 将数据由高精度转换为低精度,就需要使用到强制转换
- 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
object TestForceTransfer {
def main(args: Array[String]): Unit = {
//(1)将数据由高精度转换为低精度,就需要使用到强制转换
var n1: Int = 2.5.toInt // 这个存在精度损失
//(2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
var r1: Int = 10 * 3.5.toInt + 6 * 1.5.toInt // 10 *3 + 6*1= 36
var r2: Int = (10 * 3.5 + 6 * 1.5).toInt // 44.0.toInt =44
println("r1=" + r1 + " r2=" + r2)
}
}
数值类型和String 类型间转换
在程序开发中,我们经常需要将基本数值类型转成 String 类型。或者将 String 类型转成基本数值类型。
- 基本类型转 String 类型(语法:将基本类型的值+"" 即可)
- String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、
s1.toLong、s1.toShort)
package com.mingyu.spark.core.test
object TestTransform2 {
def main(args: Array[String]): Unit = {
// 数值类型和String 类型间转换
// 1、String转数值类型
var i1: Int = "1".toInt
var f1: Float = "2.3".toFloat
println(f1.getClass.getSimpleName) // float
// 当小数类型字符串转为Int时,会报错
//var i2: Int = "9.9".toInt // NumberFormatException
// 精度损失
var f2: Float = "1.111222333444".toFloat
var d1: Double = "1.111222333444555666777888999".toDouble
println(f2) // 1.1112224
println(d1) // 1.1112223334445557
// 2、Int,float,...转String
var s1: String = 1.2.toString
var s2: String = 1 + ""
println(s1.getClass.getSimpleName) // String
println(s2.getClass.getSimpleName) // String
}
}
Int转Byte,注意溢出问题
// n: 00000000 00000000 00000000 10000010
// Byte范围是-128~127
var n: Int = 130
var b: Byte = 1
b = n.toByte // 溢出2
println(b) // -126