为了账号安全,请及时绑定邮箱和手机立即绑定

学习围棋—范围

学习围棋—范围

Go
开满天机 2021-05-14 18:19:12
嗨,我是Go编程语言的新手。我正在从http://www.golang-book.com/学习在第4章的练习中,有一个关于从华氏温度转换为摄氏度的问题。我将答案编码如下    package mainimport "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.234234the temperature in Centigrade is  -10.980981111111111the temperature in Centigrade is  -0the temperature in Centigrade is  -10.980981111111111the temperature in Centigrade is  -0我的问题是关于outpu2和outpu4。括号是正确的,但是它如何或为什么显示-0。谁能解释一下
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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

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

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

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


查看完整回答
反对 回复 2021-05-24
?
桃花长相依

TA贡献1860条经验 获得超8个赞

围棋语言规格说明float32float64签署浮动遵循IEEE-754标准的数字。以下是引自维基百科的文字-签名为零

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

显然,input当afloat64加上负32时,它变成另一个float64为负数。5/9评估为0。负数float64计时0-0

有趣的是,如果您将input整数替换为,例如1,则会得到0而不是-0。似乎在Go中,浮点数同时具有+0-0,而整数则没有。

编辑: PhiLho在注释中解释了为什么整数不具有浮点数的原因:标准化的浮点数具有+ 0,-0,NaN,+ Infinity和-Infinity的特殊表示形式,而您无法保留一些位组合整数具有这样的含义。


查看完整回答
反对 回复 2021-05-24
  • 2 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号