以下代码在“ 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)
}
答案 0 :(得分:1)
常量的转换与非常量的转换遵循不同的规则。
第一个非常数:
数字类型之间的转换
对于非恒定数值的转换,请遵循以下规则 申请:
- ...
- 将浮点数转换为整数时,分数将被舍弃(截断为零)。
- ...
所以这是可能的:
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)
,因此它是非法的。