Go微服务实战
上QQ阅读APP看书,第一时间看更新

2.2 浮点型

Go语言有两种类型的浮点型,分别为float32和float64,建议尽量使用float64。举例如下:


var f1 float32 = 9.90
fmt.Println(f1*100)
var f2 float64 = 9.90
fmt.Println(f2*100)

执行上面的代码,会有如下结果:


989.99994
990

float32输出的结果明显是不对的,这是因为float32是按照默认小数位数输出的,但默认的小数位数并不准确。而float64则输出了正确的结果。所以,在使用浮点型时,应尽可能使用float64。

为了对前面介绍的整型以及本节的浮点型进行全面的对比,下面给出整型和浮点型的示例代码,读者可以看到各个类型的取值范围及默认值:


1. package main
2.
3. import "fmt"
4.
5. func main() {
6.      // 无符号整型,默认值都是0
7.      var u8 uint8
8.      var u16 uint16
9.      var u32 uint32
10.     var u64 uint64
11.     fmt.Printf("u8: %d, u16: %d, u32: %d, u64: %d\n", u8, u16, u32, u64)
            // 默认值都为0
12.     u8 = 255
13.     u16 = 65535
14.     u32 = 4294967295
15.     u64 = 18446744073709551615
16.     fmt.Printf("u8: %d, u16: %d, u32: %d, u64: %d\n", u8, u16, u32, u64)
17.
18.     // 整型
19.     var i8 int8
20.     var i16 int16
21.     var i32 int32
22.     var i64 int64
23.     fmt.Printf("i8: %d, i16: %d, i32: %d, i64: %d\n", i8, i16, i32, i64)
            // 默认值都为0
24.     i8 = 127
25.     i16 = 32767
26.     i32 = 2147483647
27.     i64 = 9223372036854775807
28.     fmt.Printf("i8: %d, i16: %d, i32: %d, i64: %d\n", i8, i16, i32, i64)
29.
30.     // int型,32位系统的取值范围为int32,64位系统的为int64,两种系统的取值相同但为
           不同类型
31.     var i int
32.     //i = i32 // 报错,编译不通过,类型不同
33.     //i = i64 // 报错,编译不通过,类型不同
34.     i = -9223372036854775808
35.     fmt.Println("i: ", i)
36.
37.     // 浮点型,f32的精度为6位小数,f64的精度为15位小数
38.     var f32 float32
39.     var f64 float64
40.     fmt.Printf("f32: %f, f64: %f\n", f32, f64) // 默认值都为 0.000000
41.     f32 = 1.12345678
42.     f64 = 1.12345678901234567
43.     fmt.Printf("f32: %v, f64: %v\n", f32, f64) // 末位四舍五入,输出:f32:
            1.1234568, f64: 1.1234567890123457
44.
45.     // 复数型
46.     var c64 complex64
47.     var c128 complex128
48.     fmt.Printf("c64: %v, c128: %v\n", c64, c128) // 实数、虚数的默认值都为0
49.     c64 = 1.12345678 + 1.12345678i
50.     c128 = 2.1234567890123456 + 2.1234567890123456i
51.     fmt.Printf("c64: %v, c128: %v\n", c64, c128) // 输出:c64:
           (1.1234568+1.1234568i), c128: (2.1234567890123457+2.1234567890123457i)
52.
53.     // 字符型
54.     var b byte                                       // uint8 别名
55.     var r1, r2 rune                                  // uint16 别名
56.     fmt.Printf("b: %v, r1: %v, r2: %v\n", b, r1, r2) // 默认值为0
57.     b =  'a'
58.     r1 = 'b'
59.     r2 = '字'
60.     fmt.Printf("b: %v, r1: %v, r2: %v\n", b, r1, r2) // 输出:b: 97(ASCII
            表示的数), r1: 98(utf-8表示的数), r2: 23383 (utf-8表示的数)
61.
62.     b = u8
63.     r1 = i32
64.     fmt.Printf("b: %v, r1: %v\n", b, r1) // 输出:b: 255, r1: 2147483647
65.
66.     // 指针地址
67.     var p uintptr
68.     fmt.Printf("p: %v\n", p) // 默认值为0
69.     p = 18446744073709551615 // 64位系统最大值
70.     //p = 18446744073709551616 // 报错:超出最大值
71.     fmt.Printf("p: %v\n", p)
72. }