5.Go语言基本类型 —— 浮点型
程序员文章站
2024-03-23 22:32:46
...
浮点类型(小数类型)
Go语言支持两种浮点型数:float32 和 float64。这两种浮点型数据格式遵循 IEEE 754 标准:
- float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。
- float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。
取值范围
这些浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量 math.MaxFloat32表示float32能表示的最大数值,大约是 3.403e38;对应的math.MaxFloat64常量大约是 1.798e308。它们分别能表示的最小值近似为 -3.403e38和 -1.798e308。
一个float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度。
函数math.IsNaN用于测试一个数是否是非数NaN,math.NaN则返回非数对应的值。虽然可以用math.NaN来 表示一个非法的结果,但是测试一个结果是否是非数NaN则是充满风险的,因为NaN和任何数都是不相等的。 如果一个函数返回的浮点数结果可能失败,最好的做法是用单独的标志报告失败。
nan := math.NaN()
fmt.Println(nan == nan, nan < nan, nan > nan) // "false false false"
对浮点数的说明
- 关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位
- 尾数部分可能丢失,造成精度损失。 -123.0000901 [-1238888887788999.0000901]
- 浮点型的存储分为三部分:符号位+指数位+尾数位 在存储过程中,精度会有丢失
浮点型使用细节
- Golang 浮点类型有固定的范围和字段长度,不受具体OS(操作系统)的影响。
- Golang 的浮点型默认声明为float64 类型。
- 浮点型常量有两种表示形式
十进制数形式:如:5.12 .512 (必须有小数点)
科学计数法形式:如:5.12e2 = 5.12 * 10的2次方 5.12E-2 = 5.12/10的2次方
- 通常情况下,应该使用 float64 ,因为它比float32 更精确。[开发中,推荐使用float64]
处理精度方法
处理精度的几种方法:
1: float 转 decimal 类型,decimal 互乘 不会丢失精度
2: float 乘 float 后,进行四舍五入 只保留需要的位数
var refundFee, _ = strconv.ParseFloat("1129.6", 64)
log.Println(refundFee) //1129.6 float类型
f1 := decimal.NewFromFloat(refundFee)
log.Println(f1) //1129.6 decimal 类型
f2 := decimal.NewFromFloat(100)
log.Println(f1.Mul(f2)) // 112960 decimal 类型
log.Println(refundFee * 100) //112959.99999999999
var s = Round(refundFee*100, 2)
log.Println(s) // 112960
// f:需要处理的浮点数,n:要保留小数的位数
// Pow10()返回10的n次方,最后一位四舍五入,对n+1位加0.5后四舍五入
func Round(f float64, n int) float64 {
n10 := math.Pow10(n)
return math.Trunc((f+0.5/n10)*n10) / n10
}
上一篇: 汇编语言(王爽)实验一