我最近在使用golang的类型系统进行了实验,并遇到了与浮动相关的有趣(或不是)行为:
package main
import (
"fmt"
)
func main() {
doesntWork()
works()
}
func doesntWork() {
x := 1234
y := x / 100000.0
s := fmt.Sprintf("%.8f", y)
fmt.Printf("%s\n", s)
}
func works() {
x := 1234
y := float64(x) / 100000.0
s := fmt.Sprintf("%.8f", y)
fmt.Printf("%s\n", s)
}
我认为,在上面示例中显示的情况下,在过程doesntWork()
中,当float32/64
除以隐式int
时,golang不会自动“假设”float
}?那是对的吗?任何人都可以指向一些文档或规范,在那里我可以更多地了解golang在上述情况下的表现吗?
答案 0 :(得分:4)
这里10000.0
不是float64 / 32它是一个数字常量。对于表达式,Go将假定x
的类型,并且truncate
常量100000.0为整数
func doesntWork() {
x := 1234
y := x / 100000.0
s := fmt.Sprintf("%.8f", y)
fmt.Printf("%s\n", s)
}
如果您将其更新为
func doesntWork() {
x := 1234
y := x / float64(100000.0)
s := fmt.Sprintf("%.8f", y)
fmt.Printf("%s\n", s)
}
它会错误地说
invalid operation: x / float64(100000) (mismatched types int and float64)
同样,如果将常量更改为100000.111,其中truncating
为整数将不再给出相同的值,则会出错
func doesntWork() {
x := 1234
y := x / 100000.1
s := fmt.Sprintf("%.8f", y)
fmt.Printf("%s\n", s)
}
说错误
constant 100000 truncated to integer