介绍
在go
语言中,包含有小数点的数字就是浮点型。例如3.13
,go
语言中的浮点采用的是IEEE 754标准的表达式。
浮点数表示方法
在go
中,有两个类型用来表示浮点,float32
和float64
,如果你学过C
语言,那么go
中的float32
相当于C
中的float
类型,float64
相当于C
语言当中的double
类型。
例如现在要定义一个浮点数,可以参考下面的代码:
var a1 float32
a1 = 2
a2 := 2.0 // 如果不加上小数点,那么a2就会被推到成整型。
在上面的例子中,a2的值为2.0
,被自动推到为float64
,不管赋的值是否是用32位表示。所以此时如果将a1 = a2
,就会出现编译错误。只能通过强制类型转换解决。
a1 = float32(a2)
浮点数比较方法
使用浮点数来表达数据,并不精确,所以像整型那样直接使用==
来进行判断是不可行的。
下面是作者在golang中文网看到的一种比较浮点数的方法,可以参考。
import (
"fmt"
"math"
)
func main() {
// 设置精确度为0.00001
var a Accuracy = func() float64 { return 0.00001 }
fmt.Println(a.Equal(0.11111222, 0.11111222233333)) //打印结果为:true
}
type Accuracy func() float64
func (this Accuracy) Equal(a, b float64) bool {
return math.Abs(a-b) < this()
}
func (this Accuracy) Greater(a, b float64) bool {
return math.Max(a, b) == a && math.Abs(a-b) > this()
}
func (this Accuracy) Smaller(a, b float64) bool {
return math.Max(a, b) == b && math.Abs(a-b) > this()
}
func (this Accuracy) GreaterOrEqual(a, b float64) bool {
return math.Max(a, b) == a || math.Abs(a-b) < this()
}
func (this Accuracy) SmallerOrEqual(a, b float64) bool {
return math.Max(a, b) == b || math.Abs(a-b) < this()
}
复数类型
复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示虚部(imag)。
那么什么是实数呢?
实数是有理数和无理数的总称。
有理数为整数(正整数、0、负整数)和分数的统称。
无理数,也称为无限不循环小数,不能写作两整数之比。无理数是指实数范围内不能表示成两个整数之比的数。简单的说,无理数就是10进制下的无限不循环小数,如圆周率、 等。
复数表示
复数表示示例如下:
var value1 complex64 // 由2个float32构成的复数类型
value1 = 3.2 + 12i
value2 := 3.2 + 12i // value2是complex128类型
value3 := complex(3.2, 12) // value3结果同 value2
复数它的默认类型是complex128(64位实数+64位虚数)。如果需要小一些的,也有complex64(32位实数+32位虚数)。复数的形式为RE + IMi,其中RE是实数部分,IM是虚数部分,而最后的i是虚数单位。