在将float常量转换为int的类型期间,常量被截断为整数错误

时间:2019-10-16 00:07:48

标签: go

以下代码在“ var a int = int(1.333)”行上引发错误“ 常量被截断为整数”。我对GO和无法找出实际问题。

package main

import (
    "fmt"
    "math"
)

func main() {
    var x, y int = 3, 4
    const k float64=2.2
    var a int = int(1.333)
    var f float64 = math.Sqrt(float64(x*x+y*y))
    var z uint = uint(f)
    fmt.Println(x, y, z,a)
}

1 个答案:

答案 0 :(得分:1)

常量的转换与非常量的转换遵循不同的规则。

第一个非常数:

  

数字类型之间的转换

     

对于非恒定数值的转换,请遵循以下规则   申请:

     
      
  1. ...
  2.   
  3. 将浮点数转换为整数时,分数将被舍弃(截断为零)。
  4.   
  5. ...
  6.   

所以这是可能的:

var f = float64(1.333)
var i = int(f)

现在的常量:

  

如果x是可表示的,则常量x可以转换为T型   T的值。

然后,在文档中,有一系列示例表达式,其中一个是这样的:

int(1.2) // illegal: 1.2 cannot be represented as an int

关于可表示性

  

如果x之一是常数,则x可以用类型T的值表示。   适用以下条件:

     
      
  • x在T确定的值集中。
  •   
  • T是浮点类型,x可以四舍五入到T的精度而不会溢出。舍入使用IEEE 754舍入到偶数规则,但IEEE负零进一步简化为无符号零。请注意,常数永远不会导致IEEE负零,NaN或无穷大。
  •   
  • T是复杂类型,并且x的成分real(x)和imag(x)可以用T的成分类型(float32或float64)的值表示。
  •   

3个条件中的任何一个都不适用于表达式var a int = int(1.333),因此它是非法的。


详细了解ConversionsRepresentability