首页 » 网站建设 » php浮点数比拟技巧_golang2021数据类型6浮点数精度与比较

php浮点数比拟技巧_golang2021数据类型6浮点数精度与比较

访客 2024-10-29 0

扫一扫用手机浏览

文章目录 [+]

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

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

php浮点数比拟技巧_golang2021数据类型6浮点数精度与比较

varfloatValue1 float32

php浮点数比拟技巧_golang2021数据类型6浮点数精度与比较
(图片来自网络侵删)

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,约定如果两个浮点数的差值在此精度的偏差范围之内,则剖断这两个浮点数相等。
这个办理方案也是其他措辞判断浮点数相等所采取的通用方案。

标签:

相关文章