背景

以前一直以为除数为0会报错,但却遇到了一次例外,非但没有报错,甚至比较其他小数还成功了。
记录一下

测试

1. int

首先试了一下整型数的情况

func Test_divInt(t *testing.T) {
	var a, b int = 0, 0
	ans := a / b
	fmt.Println(ans)
}

— FAIL: Test_divInt (0.00s)
panic: runtime error: integer divide by zero [recovered]
panic: runtime error: integer divide by zero

如预期所料一致,的确报了被0除的painc错误

2. float

接下来试浮点型

  • 如果在算式中直接写数字
func Test_divFloat(t *testing.T) {
	ans := 1.0 / 0.0
	fmt.Println(ans)
}

这种情况 编译器会直接提示错误:

func_test.go:55:13: division by zero


接下来就是两种不会报错的情况

  • 被除数,除数都为浮点型变量
func Test_divFloat(t *testing.T) {
	var a, b float64 = 0.0, 0.0
	ans1 := a / b		
	fmt.Println(ans1)	// 结果为NaN 这里与网上看到的结果不一样
	if math.IsNaN(ans1) {
		fmt.Println("ans1 is NaN")	//为NaN
	}
	if ans1 > 1 { //比较为false
		fmt.Println("bigger than 1") 
	}
}

NaN
ans1 is NaN

在这个测试中,两个浮点型变量相除 如果除数为0 得到了NaN这个结果
NaN(not-a-number)代表非数字
他与任何数值比较都为false 即使NaN==NaN 也为false [不等于时!=都为true]


  • 被除数为浮点型变量 除数为浮点值
func Test_divFloat(t *testing.T) {
	var afloat64 = 1.0
	ans2 := a / float64(0)		
	fmt.Println(ans2)	// 结果为NaN 
	if math.IsNaN(ans2) {
		fmt.Println("ans2 is NaN")	//为NaN
	}
	if ans2 > 1 { //比较为false
		fmt.Println("bigger than 1") 
	}
}

这种情况与上一种情况一样 结果为NaN

  • 被除数为浮点值 除数为浮点型变量

func Test_divFloat(t *testing.T) {
	var a float64 = 0.0
	ans3 := 1.0 / a
	fmt.Println(ans3)  //结果为 +Inf
	if ans3 > 1 {
		fmt.Println("bigger than 1") //可以比较 大于1
	}
	if math.IsInf(ans3, 1) {
		fmt.Println("ans3 is +inf") //+Inf
	}
}

+Inf
bigger than 1
ans3 is +inf

这种情况下 结果就有所不一样
得到的答案是+Inf 正无穷大 并且可以和其他数值进行比较
此外 只要除数是变量 即使是int型 在算式中转成float同样得到+Inf的结果

var a int = 0
ans := 1.0/float64(a) //结果为 +Inf

总结

在官方的文档: https://golang.org/ref/spec#Constant_expressions

明确说明不要使用0做除数
所以不要用这种小trick想去方便得到无穷值
未来不知道会怎么优化
还是安心使用math.Inf
总有些意想不到的小细节 在碰到之后才会知晓