嗨,我是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。
有人可以解释一下
答案 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表示float32
和float64
是符合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
为-0
为input
。
有趣的是,如果用整数替换1
,例如0
,您将获得-0
而不是+0
。似乎在Go中,浮动数字同时具有-0
和{{1}},但整数不具有。{/ p>
编辑: PhiLho在评论中解释浮点数有这样的事情而整数没有:规范化的浮点数具有+0的特殊表示, - 0,NaN,+ Infinity和-Infinity,虽然你不能保留一些整数的位组合来具有这样的含义。