欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

5.Go语言基本类型 —— 浮点型

程序员文章站 2024-03-23 22:32:46
...

浮点类型(小数类型)
Go语言支持两种浮点型数:float32 和 float64。这两种浮点型数据格式遵循 IEEE 754 标准:

  1. float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32。
  2. float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64。

取值范围
这些浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量 math.MaxFloat32表示float32能表示的最大数值,大约是 3.403e38;对应的math.MaxFloat64常量大约是 1.798e308。它们分别能表示的最小值近似为 -3.403e38和 -1.798e308。
5.Go语言基本类型 —— 浮点型
一个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"

对浮点数的说明

  1. 关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位
  2. 尾数部分可能丢失,造成精度损失。 -123.0000901 [-1238888887788999.0000901]
    5.Go语言基本类型 —— 浮点型
  3. 浮点型的存储分为三部分:符号位+指数位+尾数位 在存储过程中,精度会有丢失
    5.Go语言基本类型 —— 浮点型

浮点型使用细节

  1. Golang 浮点类型有固定的范围和字段长度,不受具体OS(操作系统)的影响。
  2. Golang 的浮点型默认声明为float64 类型。
  3. 浮点型常量有两种表示形式
    十进制数形式:如:5.12 .512 (必须有小数点)
    科学计数法形式:如:5.12e2 = 5.12 * 10的2次方 5.12E-2 = 5.12/10的2次方
    5.Go语言基本类型 —— 浮点型
  4. 通常情况下,应该使用 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
}