3
、浮点数类型
浮点型用于表示包含小数点的数据,比如
1.234
就是一个浮点型数据。
Go
语言中的浮点类型采用
IEEE-754
标准的表达方式。
float32
精度是小数点后
7
位
float64
精度是小数点后
15
位。
1.
浮点数表示
Go
语言定义了两个类型
float32
和
float64
,其中
float32
等价于
C
语言的
float
类型,
float64
等价于
C
语言的
double
类型。
在
Go
语言里,定义一个浮点数变量的代码如下:
var fvalue1 float32
fvalue1 = 12
fvalue2 := 12.0 //
如果不加小数点,
fvalue2
会被推导为整型而不是
浮点型
对于以上例子中类型被自动推导的
fvalue2
,需要注意的是其类型将被自动
设为
float64
,
而不管赋给它的数字是否是用
32
位长度表示的。因此,对于以上的例子,
下面的赋值将导致编译错误:
fvalue1 = fvalue2
而必须使用这样的强制类型转换:
fvalue1 = float32(fvalue2)
2
、浮点数比较
1/3
2/3
因为浮点数不是一种精确的表达方式,所以像整型那样直接用
==
来判断
两个浮点数是否相等
是不可行的,这可能会导致不稳定的结果。下面是一种推荐的替代方案:
golang
中的高精度计算包
github.com/shopspring/decimal
go get github.com/shopspring/decimal
package main
import (
"fmt"
"github.com/shopspring/decimal"
)
func main() {
v1 := decimal.NewFromFloat(0.0000000000012)
v2 := decimal.NewFromFloat(0.0000000000011)
fmt.Println(v1.Equal(v2))
}
执行结果:
false
或者:
package main
import "fmt"
import "math" //
数学库
Abs ()
求绝对值函数
, Max()
求最大值函数
func main() {
aa:= 2.55
bb:= 1.23
//
比较
float64
大小 用到了库函数 和精度比较
if math.Max(aa, bb) == aa && math.Abs(aa-bb) > 0.000001 {
fmt.Println(aa,bb)
}
}
十进制下,
float32
有效数字大约有
7
位,
3/3
float64
有效数字大约有
15
位,
说明:
(
1
)浮点数在机器中存在的形式:浮点数
=
符号位
+
指数位
+
尾数位(浮点数都
是有符号的)
(
2
)尾数部分可能丢失,造成精度损失;
(
3
)浮点型的存储分为三个部分:符号位
+
指数位
+
尾数位;
浮点型的使用细节:
(
1
)
golang
浮点类型有固定的范围和字段长度,不受操作系统的影响;
(
2
)
golang
默认为
float64
类别;
(
3
)浮点型常用两种形式表示:
1
)十进制:
5.12
、
0.512
2
)科学记数法形式:
5.1234E2
、
5.1234E-2
(
4
)通常使用
float64
,它精度更高;