Golang的类型系统行为 - 将int除以隐式浮点数

时间:2017-01-02 07:19:11

标签: go

我最近在使用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)
}

Go Playground

我认为,在上面示例中显示的情况下,在过程doesntWork()中,当float32/64除以隐式int时,golang不会自动“假设”float }?那是对的吗?任何人都可以指向一些文档或规范,在那里我可以更多地了解golang在上述情况下的表现吗?

1 个答案:

答案 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