Следующий код вызывает ошибку « Константа усечена до целого числа » в строке « 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)
}
go
0
Charan Reddy 16 Окт 2019 в 03:07

1 ответ

Лучший ответ

Преобразование констант выполняется по иным правилам, чем преобразование неконстант.

Первые неконстантные:

Преобразования между числовыми типами

Для преобразования непостоянных числовых значений применяются следующие правила:

  1. ...
  2. При преобразовании числа с плавающей запятой в целое дробь отбрасывается (усечение до нуля).
  3. ...

Так что это возможно:

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

Теперь константы:

Постоянное значение x можно преобразовать в тип T, если x представимо с помощью значение T.

Затем в документации есть список примеров выражений, одним из которых является следующее:

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

О представимости

Константа x может быть представлена ​​значением типа T, если выполняется одно из следующих условий:

  • x находится в наборе значений, определяемых T.
  • T - это тип с плавающей запятой, и x можно округлить до точности T без переполнения. Для округления используются правила округления до четности IEEE 754, но с отрицательным нулем IEEE, дополнительно упрощенным до нуля без знака. Обратите внимание, что постоянные значения никогда не приводят к отрицательному нулю IEEE, NaN или бесконечности.
  • T - сложный тип, и компоненты x real (x) и imag (x) могут быть представлены значениями типа компонента T (float32 или float64).

Ни одно из трех условий не применяется к выражению var a int = int(1.333) и, следовательно, является незаконным.


Подробнее о конверсиях и Представимость

3
mkopriva 16 Окт 2019 в 07:25