学习围棋 - 范围

时间:2012-11-22 02:45:40

标签: go

嗨,我是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。

有人可以解释一下

2 个答案:

答案 0 :(得分:7)

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

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

我猜在上面的情况2和4中,b / c (5/9)存在而不考虑input,编译器将它们解释为int并简单地将表达式替换为0,at那么零被认为是依赖于输入,因此在最终编译之前采用类型float64

一般来说,Go不会为您转换数字类型,因此这是对我有用的唯一解释。

答案 1 :(得分:3)

Go language Spec表示float32float64是符合IEEE-754标准的有符号浮点数。以下文字引自Wikipedia - Signed zero

  

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

显然,input,作为float64,当应用减去32时,变成另一个float64,这是负数。 5/9评估为0。由float64计时的0-0input

有趣的是,如果用整数替换1,例如0,您将获得-0而不是+0。似乎在Go中,浮动数字同时具有-0和{{1}},但整数不具有。{/ p>

编辑: PhiLho在评论中解释浮点数有这样的事情而整数没有:规范化的浮点数具有+0的特殊表示, - 0,NaN,+ Infinity和-Infinity,虽然你不能保留一些整数的位组合来具有这样的含义。