over-golang/01-基础语法/06-值类型-1-数值类型.md
2021-07-02 18:11:59 +08:00

3.4 KiB
Raw Permalink Blame History

一 数值类型

数值类型指基本类型中的:整型、浮点型、复数。

二 整数

整数类型有无符号(如int)和带符号(如uint)两种,这两种类型的长度相同,但具体长度取决于不同编译器的实现。

int8、int16、int32和int64四种有符号整数类型分别对应8、16、32、64bit大小的有符号整数 同样uint8、uint16、uint32和uint64对应四种无符号整数类型。

有符号类型:

int     32位系统占4字节与int32范围一样64位系统占8个节与int64范围一样     
int8    占据1字节   范围 -128 ~ 127
int16   占据2字节   范围 -2(15次方) ~ 215次方-1
int32   占据4字节   范围 -2(31次方) ~ 231次方-1
int64   占据8字节   范围 -2(63次方) ~ 263次方-1
rune	int32的别称

无符号类型:

uint	32位系统占4字节与uint32范围一样64位系统占8字节与uint64范围一样     
uint8   占据1字节   范围 0 ~ 255
uint16  占据2字节   范围 0 ~ 216次方-1
uint32  占据4字节   范围 0 ~ 232次方-1
uint64  占据8字节   范围 0 ~ 264次方-1
byte	uint8的别称

注意:

  • 上述类型的变量由于是不同类型,不允许互相赋值或操作
  • Go默认的整型类型是int
  • 查看数据所占据的字节数方法unsafe.Sizeof()

三 浮点类型

3.1 浮点类型的分类

float32 单精度  占据4字节   范围 -3.403E38 ~ 3.403E38    (math.MaxFloat32)
float64 双精度  占据8字节   范围 -1.798E208 ~ 1.798E308  (math.MaxFloat64)

由上看出:

  • 浮点数是有符号的,浮点数在机器中存放形式是:浮点数=符号位+指数位+尾数位
  • 浮点型的范围是固定的,不受操作系统限制
  • .512 这样数可以识别为 0.512
  • 科学计数法:
    • 5.12E2 = 5.12 * 102
    • 5.12E-2 = 5.12 / 102

3.2 精度损失

float32可以提供大约6个十进制数的精度float64大约可以提供15个十进制的精度一般选择float64

var num1 float32 = -123.0000901
var num2 float64 = -123.0000901 
fmt.Println("num1=",num1)		// -123.00009
fmt.Println("num2=",num2)		// -123.0000901

3.3 浮点数判断相等

使用 == 号判断浮点数,是不可行的,替代方案如下:

func isEqual(f1,f2,p float64) bool {
    // p为用户自定义精度0.00001
   return math.Abs(f1-f2) < p           
}

四 复数

Go中复数默认类型是complex12864位实数+64位虚数。如果需要小一些的也有complex64(32位实数+32位虚数)。

复数的形式为RE + IMi其中RE是实数部分IM是虚数部分而最后的i是虚数单位。

如下所示:

var t complex128
t = 2.1 + 3.14i
t1 = complex(2.1,3.14) // 结果同上	
fmt.Println(real(t))   // 实部2.1
fmt.Println(imag(t))   // 虚部3.14

五 NaN非数

go中的NaN非数:

var z float64
// 输出 "0 -0 +Inf -Inf NaN"
fmt.Println(z, -z, 1/z, -1/z, z/z) 

注意:

  • 函数math.IsNaN用于测试一个数是否是非数NaN
  • 函数math.NaN则返回非数对应的值。
  • 虽然可以用math.NaN来表示一个非法的结果但是测试一个结果是否是非数NaN则是充满风险的因为NaN和任何数都是不相等的。
nan := math.NaN()
// "false false false"
fmt.Println(nan == nan, nan < nan, nan > nan)