2013-07-04 3 views
4

사용자가 입력 할 숫자를 var input float64으로 정의하고 정수를 입력하면 오류가 발생할 것으로 예상되지만 err = <nil>이 표시됩니다. 내가 뭘 놓치고 있니?왜 형식 불일치 오류가 있습니까?

Conversions

특정 규칙이 숫자 유형 사이 (비 - 상수) 변환에 적용

C:\Go\src\play\exercise>go run exercise2.go 
Enter a number to take its square root: 1 
err = <nil> 
n is 1: 
+2

1은 완벽하게 유효한 부동 소수점 숫자입니다. – fuz

+1

아니, 몰랐다. 나는 부동 소수점 숫자가 십진수로 쓰여질 필요가 있다고 생각했다. 내가 생각하던대로,'1.0'은 에러가 발생하지 않아야하지만'1'은 에러를 발생시켜야합니다. 예를 들어, Mark Summerfield의 Go의 책에서 "부동 소수점 숫자는 소수점을 사용하여 쓰여졌습니다 ..." – Zeynel

+0

@FUZxxl이 말하고자하는 것은 "1"은 부동 소수점 숫자로 완벽하게 표현할 수 있다고 생각합니다. 즉 '1.0'이다. '% f' 형식은 소수점을 포함하는 부동 소수점 숫자를 읽어야합니다. 왜냐하면 사람들은 모든 필요가 "1"이라면 사람들이 "1.0"을 입력하는 것을 원하지 않을 것이기 때문입니다. 그러나 실제 증거를 포함하는보다 완전한 답변에 관심이있을 것입니다.) – fresskoma

답변

3

의 이동 프로그래밍 언어 사양 :

package main 

import (
    "fmt" 
) 

func main() { 
    var input float64 

    fmt.Print("Enter a number:") 

    n, err := fmt.Scanf("%f\n", &input) 

    fmt.Printf("err = %v\n", err) 

    if err != nil { 
     fmt.Printf("%v is not a float - exiting with error\n", input, err) 
     return 
    } 

    fmt.Printf("n is %v:", n) 
} 

이 출력됩니다. 숫자 타입

비정 수치의 변환

을 사이

전환, 다음과 같은 규칙이 적용 :

  1. 값 부호 정수인 경우, 정수 타입간에 변환을 암시 적 무한 정밀도로 확장 된 부호입니다. 그렇지 않으면 0으로 확장됩니다. 결과 형식의 크기 인 에 맞게 잘립니다. 예를 들어, v : = uint16 (0x10F0)이면 uint32 (int8 (v)) == 0xFFFFFFF0입니다. 전환은 항상 유효한 값을 산출합니다. 넘치는 표시가 없습니다.
  2. 부동 소수점 숫자를 정수로 변환 할 때 분수 은 버려집니다 (제로쪽으로 절단).
  3. 정수 또는 부동 소수점 수를 부동 소수점 유형으로 변환하거나 복소수를 다른 복합 유형으로 변환하는 경우 결과 값은 대상 유형으로 지정된 정밀도로 반올림됩니다. 예를 들어 float32 유형의 변수 x 값은 IEEE-754 32 비트 숫자보다 높은 정밀도를 사용하여 저장할 수 있지만 float32 (x)는 의 결과를 32 비트 정밀도로 반올림 한 결과를 나타냅니다. . 마찬가지로 x + 0.1은 32 비트 이상의 정밀도 인 을 사용할 수 있지만 float32 (x + 0.1)는 그렇지 않습니다. 결과 유형이 전환 성공 값을 표시 할 수 있지만, 그 결과 값은 구현에 의존하는 경우, 부동 소수점 또는 복합 값을 포함하는 모든 비 - 정수 변환에서

.

이동에서는 정수 유형을 부동 소수점 유형으로 변환 할 수 있습니다. 따라서 용서하지 않을 이유가 없습니다.

, 당신은 무엇을 보수적 (당신이 다른 사람 을에서 받아 들일 것에 자유주의 종종 재 진술 수 :

컴퓨팅에서 Robustness principle

는 견고 원리는 소프트웨어에 대한 일반적인 디자인 가이드 라인 입니다 "당신이 보내는 것을 보수적으로 받아들이십시오. 당신이 받아들이는 바에 서 자유 주의적이어야합니다.").

원리도하는 전송 제어 프로토콜의 초기 사양에 쓴 인터넷 선구자 존 포스텔, 후, 포스텔의 법칙으로 알려져 있습니다 : 1

TCP 구현은 견고성의 일반 원칙을 따라야합니다 : 일 보수적 인> 당신이하는 일은 자유 주의자가되어야합니다. 다른 사람들로부터 받아들입니다. 입력을 수신

, 완전히 사양을 준수해야 다른 컴퓨터 (또는 동일한 시스템에 다른 프로그램 )에 명령이나 데이터를 전송 코드,하지만 코드는 한 비 준수 입력을 허용한다 의미가 분명하기 때문입니다.

+1

그리고 여기에 다른 링크가 있습니다. golang 사양 : http://golang.org/ref/spec#Floating-point_literals – pkuderov

+1

질문에 실제로 답변하지 않습니다. – ispilledthejava

1

는 scanf와는 포맷에 의해 결정되는 연속적인 인자로 연속 공간으로 분리 된 값을 저장하는 표준 입력으로부터 판독 텍스트를 스캔한다. 성공적으로 검사 된 항목 수를 반환합니다.

Scanf는 읽은 항목의 수를 반환합니다. 이 경우 n == 1 왜냐하면 ... 하나의 토큰을 입력 한 다음에 개행 문자를 입력했기 때문입니다. 아마도 이 아니라 input의 값을 원할 것입니다.