3

嗨,我是 Go 编程语言的新手。

我正在学习http://www.golang-book.com/

在第 4 章的练习下,有一个关于从华氏温度转换为摄氏度的问题。

我将答案编码如下

    package main

import "fmt"

func main(){

    fmt.Println("Enter temperature in Farentheit ");

    var input float64

    fmt.Scanf("%f",&input)

    var outpu1 float64 = ( ( (input-32)* (5) ) /9)
    var outpu2 float64=  (input-32) * (5/9)
    var outpu3 float64= (input -32) * 5/9
    var outpu4 float64=  ( (input-32) * (5/9) ) 

    fmt.Println("the temperature in Centigrade is ",outpu1)
    fmt.Println("the temperature in Centigrade is ",outpu2)
    fmt.Println("the temperature in Centigrade is ",outpu3)
    fmt.Println("the temperature in Centigrade is ",outpu4) 
}

输出如下

sreeprasad:projectsInGo sreeprasad$ go run convertFarentheitToCentigrade.go 
Enter temperature in Farentheit 
12.234234
the temperature in Centigrade is  -10.980981111111111
the temperature in Centigrade is  -0
the temperature in Centigrade is  -10.980981111111111
the temperature in Centigrade is  -0

我的问题是关于outpu2 和outpu4。括号是正确的,但它如何或为什么打印 -0。

谁能解释一下

4

2 回答 2

7

很简单,表达式(5/9)被评估为(int(5)/int(9))which equals 0。尝试(5./9)

为了阐明为什么会发生这种情况,它处理了确定表达式变量类型的顺序。

我猜想 b/c(5/9)存在而不考虑input上面的情况 2 和 4,编译器将它们解释为int并简单地用 0 替换表达式,此时零被认为取决于输入,因此采用float64final 之前的类型汇编。

一般来说,Go 不会为你转换数字类型,所以这是唯一对我有意义的解释。

于 2012-11-22T03:10:06.287 回答
3

Go 语言规范表明float32并且是遵循 IEEE-754 标准的float64有符号浮点数。以下文字引自维基百科 - 签名为零

浮点算术的 IEEE 754 标准(目前由支持浮点数的大多数计算机和编程语言使用)需要 +0 和 -0。零可以被认为是扩展实数线的变体,使得 1/-0 = -∞ 和 1/+0 = +∞,除以零仅在 ±0/±0 和 ±∞/±∞ 时未定义.

显然,input作为 a float64,当应用负 32 时,会变成另一个float64负数。5/9评估为0. 一个负float64计时0-0

有趣的是,如果你input用一个整数替换,例如1,你会得到0而不是-0. 似乎在 Go 中,浮点数同时具有+0-0,但整数没有。

编辑: PhiLho在评论中解释了为什么浮点数有这样的东西而整数没有的原因:归一化的浮点数有 +0、-0、NaN、+Infinity 和 -Infinity 的特殊表示,而你不能保留一些位组合的整数具有这样的含义。

于 2012-11-22T03:14:34.140 回答