背景
以前一直以为除数为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
总有些意想不到的小细节 在碰到之后才会知晓