浮点
- go语言中提供了两种浮点型
- float32 --用32位(4个字节)来存储
- float64 --用64位(8个字节)来存储
float计算是非精确的
v1:=0.1
v2:=0.2
result:=v1+v2
fmt.Println(result)//0.30000000000000004
v3:=0.2
v4:=0.3
result1:=v3+v4
fmt.Println(result1)//0.5
2.float底层原理
第一步:浮点型转换为二进制
例如:0.3
- 整数部分直接转换 ,二进制位0
- 小数部分,乘以2,如果小于1,则继续乘以2,如果大于1,则减去1,在乘以2,直到结果为1为止。也有可能循环下去,得到每个值得整数部分拼接起来就是小数部分,二级制位:010011 (或者传统方式,除2取余,倒叙排列得的二进制)
0.3 * 2 = 0.6
0.6 * 2 = 1.2 (减去1,还剩0.2)
0.2 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6 (减去1,还剩0.6)
0.6 * 2 = 1.2
...
整数部分二进制和小数部分二进制拼接起来:0.010011...
第二步:科学计数法
0.010011... 需要往右移动2位
1.0011 *
第三步:存储(以float32位为例)
- sign , 存正负,0正数,1负数
- exponent ,存指数部分,这是是-2, 8位,共有256种可能,-2+127 = 125 转 二进制存入(不知道为啥这样)
- fraction,存储23位,把小数点后的数据存进去,多余的舍去,导致精度不精。
float64位:sign 1位,exponent 11位,fraction 52位
3.decimal
go语言内部没有decimal ,需要使用第三方包:shopspring/decimal
安装第三方包
go get github.com/shopspring/decimal
下载文件会在src中,编译后的文件存在pkg文件中
使用decimal
v1:=decimal.NewFromFloat(0.1)
v2:=decimal.NewFromFloat(0.2)
result1:=v1.Add(v2)//加
result2:=v1.Sub(v2)//减
result3:=v1.Mul(v2)//乘
result4:=v1.Div(v2)//除
fmt.Println(result1,result2,result3,result4)//0.3 -0.1 0.02 0.5
v3:=decimal.NewFromFloat(0.25432)
v4:=v3.Round(1)//0.3 保留一位小数,四舍五入
v5:=v3.Truncate(1)//0.2 保留一位小数,其他舍弃
fmt.Println(v4,v5)
布尔类型
result,err:=strconv.ParseBool("true")
fmt.Println(result,err)//true <nil>
result1 := strconv.FormatBool(true)
fmt.Println(result1,reflect.TypeOf(result1))//true,string,转成string了