GO lang - 常量截断为整数

foo*_*oty 9 floating-point syntax-error go

以下GO程序给出错误:

./fft.go:13: constant -6.28319 truncated to integer
./fft.go:13: cannot use -7 * k / N (type int) as type float64 in assignment
Run Code Online (Sandbox Code Playgroud)

程序:

package main

import (
    "math"
    "fmt"
)

func main() {
    fmt.Println("Hello world ",math.E)

    var k, N int = 1, 10
    var ans float64 = 0
    var c float64 = (-2.0 * math.Pi * k) / N
    x := make([]float64,N)
    for i := 0; i < len(x); i++ {
        x[i] = 1
    }
    ans = 0
    for i := 0; i < N; i++ {
        ans += x[i] * math.E
    }
    fmt.Println(ans)
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能使用int某种类型的float64

scv*_*lex 12

更换

var c float64 = (-2.0 * math.Pi * k) / N
Run Code Online (Sandbox Code Playgroud)

通过

var c float64 = (-2.0 * math.Pi * float64(k)) / float64(N)
Run Code Online (Sandbox Code Playgroud)

引用规范:

在表达式或赋值中混合使用不同的数字类型时,需要进行转换.例如,int32和int的类型不同,即使它们在特定体系结构上可能具有相同的大小.

Go使用静态类型,不会自动在数字类型之间进行转换.原因可能是避免一些错误.例如,应该float64(2.5) * int(2)产生什么价值和什么类型?结果应该是int(5)int(4)float64(5.0)?在Go中,这不是问题.Go FAQ对此有更多的说法.


@jnml指出,在这种情况下,以下就足够了:

var c float64 = -2 * math.Pi / float64(N)
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,是的.但我认为问题是打字,而不是让这个特定的程序工作.所以,虽然`c:= ...`是更好的代码,但我认为它有点混淆了答案. (3认同)