3

このコードがコンパイルされないのはなぜですか?

package main
const a = 1.000001
const base = 0
const b = a+base
func main() {
    f(b)
}
func f(int) {}

$ go run a.go
# command-line-arguments
./a.go:4: constant 1 truncated to integer

1が切り捨てられたと言っていますか?または、その 1 を切り捨てることはできませんか? それはどの1について話しているのですか?

誰かが上記のコードはコンパイルできないと答えましbfloat64。しかし、なぜこれはコンパイルされますか:

package main
import "fmt"
const a = 1.000001
const b = a-0.000001
func main() {
    fmt.Printf("%T %v\n",a,a)
    fmt.Printf("%T %v\n",b,b)
    f(b)
}
func f(int) {}

$ go run a.go 
float64 1.000001
float64 1

? bfloat64here ですが、 に渡すことができますf

4

4 に答える 4

2

最初のプログラムは次のように書き直すことができます。

package main
func main() {
    f(1.000001)
}
func f(int) {}

これは明らかに整数値を整数関数に渡していません。

2 番目のプログラムも同様に次のように書き直すことができます。

package main
import "fmt"
func main() {
    fmt.Printf("%T %v\n",1.000001,1.000001)
    fmt.Printf("%T %v\n",1,1)
    f(1)
}
func f(int) {}

これはうまく見えます。

私がしたことは、定数ab定数を手動で置き換えることだけでした。go が行うのはこれだけです。

于 2014-09-03T13:21:12.043 に答える