欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > GO-学习-04-基本数据类型-浮点型

GO-学习-04-基本数据类型-浮点型

2024/10/26 0:29:41 来源:https://blog.csdn.net/weixin_43491496/article/details/140701500  浏览:    关键词:GO-学习-04-基本数据类型-浮点型

浮点型:float32和float64 %f
-3.4e38——±3.4e38

package main
//import "fmt"
//import "math"
import ("fmt""unsafe""math"
)func main(){//1.定义float类型var a float32 = 3.12fmt.Printf("值:%v--%f,类型%T",a,a,a)  //3.12--3.120000,类型float32fmt.Println(unsafe.Sizeof(a)) //float32占用4个字节var b float64 = 3.12fmt.Printf("值:%v--%f,类型%T",b,b,b)  //3.12--3.120000,类型float34fmt.Println(unsafe.Sizeof(a)) //8var c float64 =3.1415925535fmt.Printf("%v--%f",c,c) //3.1415925535--3.141593   四舍五入6位小数fmt.Printf("%.2f",c)//3.14  保留两位小数fmt.Printf("%.4f",c)//3.1416   //四舍五入//64位系统,浮点型默认是float64f1 := 3.14159261fmt.Printf("%T",f1) //float64//科学计数法表示浮点型数据var f2 folat32 = 3.14e2 //3.14*10的2次方fmt.Printf("%v--%T",f2,f2) // 314--float32var f3 folat32 = 3.14e-2 //3.14*10的-2次方fmt.Printf("%v--%T",f3,f3) // 0.0314--float32//int类型转化为floata1 := 10a2 := float64(a1) fmt.Printf("a1的类型是%T,a2的类型是%T",a1,a2)  //int float64//float类型转换成intvar a3 float32 = 22.33a4 := int(a3)  //23   只直接截取,不建议
}

在Go语言中,float类型的丢失问题一般是由于浮点数的精度问题造成的。由于计算机内存的限制,浮点数无法精确表示所有的实数,因此在进行浮点数的计算时可能会出现一些舍入误差。

例如,下面的代码会导致float64类型的丢失问题:

package mainimport ("fmt"
)func main() {a := 0.1b := 0.2c := a + bfmt.Println(c)
}

上面的代码中,我们本来期望输出0.3,但实际输出的结果是0.30000000000000004。这是因为0.1和0.2在计算机中无法精确表示,所以计算结果会有一定的误差。

为了解决这个问题,可以使用Decimal类型来处理浮点数的计算。Decimal类型是Go语言中的一个精确计算库,可以避免浮点数计算中的丢失问题。

package mainimport ("fmt""github.com/shopspring/decimal"//引入包,需要提前下载,可以是全局也可以单个项目
)func main() {a := decimal.NewFromFloat(0.1)b := decimal.NewFromFloat(0.2)c := a.Add(b)  //  Add  +   Sub -    Mul *  Div /fmt.Println(c)a1 := 0.1b1 := 0.2c1 := decimal.NewFormFloat(a1).Add(decimal.NewFromFloat(b1))fmt.Println(c1)
}

使用Decimal类型进行浮点数计算时,可以得到精确的结果0.3。

除了使用Decimal类型,还可以在比较浮点数时使用一个小的误差范围来判断相等。例如,可以使用math库中的Float64bits函数将浮点数转换为一个整数,然后比较两个整数是否相等来判断两个浮点数是否相等。

package mainimport ("fmt""math"
)func main() {a := 0.1b := 0.2c := 0.3epsilon := 1e-9if math.Abs(a+b-c) < epsilon {fmt.Println("a + b = c")} else {fmt.Println("a + b != c")}
}

上面的代码中,我们使用了一个很小的误差范围epsilon来判断a+b和c是否相等,如果两者的差小于epsilon,则认为它们相等。这样可以避免浮点数丢失问题带来的影响。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com