龙空技术网

golang2021数据类型(6)浮点数精度与比较

水木成林未名教育 466

前言:

现在兄弟们对“java单精度浮点型关键字”大概比较关怀,同学们都想要学习一些“java单精度浮点型关键字”的相关知识。那么小编在网上网罗了一些有关“java单精度浮点型关键字””的相关文章,希望小伙伴们能喜欢,各位老铁们一起来学习一下吧!

浮点数的表示

Go 语言中的浮点数采用IEEE-754 标准的表达方式,定义了两个类型:float32 和 float64,其中float32 是单精度浮点数,可以精确到小数点后 7 位(类似 PHP、Java 等语言的 float 类型),float64 是双精度浮点数,可以精确到小数点后 15 位(类似 PHP、Java 等语言的double 类型)。

在 Go 语言里,定义一个浮点型变量的代码如下:

varfloatValue1 float32

floatValue1 = 10

floatValue2 := 10.0 // 如果不加小数点,floatValue2 会被推导为整型而不是浮点型

floatValue3 := 1.1E-10

对于浮点类型需要被自动推导的变量,其类型将被自动设置为 float64,而不管赋值给它的数字是否是用32 位长度表示的。因此,对于以上的例子,下面的赋值将导致编译错误:

floatValue1 = floatValue2 //floatValue2 是 float64 类型

编译错误信息如下:

cannot use floatValue2 (type float64) as type float32 inassignment

必须使用这样的强制类型转换才可以:

floatValue1 = float32(floatValue2)

在实际开发中,应该尽可能地使用 float64 类型,因为 math 包中所有有关数学运算的函数都会要求接收这个类型。

浮点数的精度

浮点数不是一种精确的表达方式,因为二进制无法精确表示所有十进制小数,比如 0.1、0.7这种,下面我们通过一个示例来给大家直观演示下:

floatValue4 := 0.1

floatValue5 := 0.7

floatValue6:= floatValue4 + floatValue5

注:浮点数的运算和整型一样,也要保证操作数的类型一致,float32 和 float64类型数据不能混合运算,需要手动进行强制转化才可以,这一点和动态语言不同。

你觉得上面计算结果 floatValue6 的值是多少?0.8?不,它的结果是 0.7999999999999999,这是因为计算机底层将十进制的0.1和 0.7 转化为二进制表示时,会丢失精度,所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。

浮点数的比较

浮点数支持通过算术运算符进行四则运算,也支持通过比较运算符进行比较(前提是运算符两边的操作数类型一致),但是涉及到相等的比较除外,因为我们上面提到,看起来相等的两个十进制浮点数,在底层转化为二进制时会丢失精度,因此不能被表象蒙蔽。

如果一定要判断相等,下面是一种替代的解决方案:

p := 0.00001

// 判断floatValue1 与 floatValue2 是否相等

ifmath.Dim(float64(floatValue1), floatValue2) < p {

fmt.Println("floatValue1 和floatValue2 相等")

}

可以看到,我们的解决方案是一种近似判断,通过一个可以接受的最小误差值 p,约定如果两个浮点数的差值在此精度的误差范围之内,则判定这两个浮点数相等。这个解决方案也是其他语言判断浮点数相等所采用的通用方案。



标签: #java单精度浮点型关键字