2014-07-20 11 views
2

float32에 소수점 이하 두 자리가 있는지 확인하고 싶습니다. 내 자바 스크립트 방법은 다음과 같습니다.소수점 이하 자릿수는 어떻게 계산합니까?

step := 0.01 
value := 9.99 

if int(value/step) % 1 == 0 { 
    printf("has two decimal places!") 
} 

위의 예제도 작동합니다. 그러나 단계가 올바르지 않으면 float64에서 int로 올바르게 캐스팅 할 수 없으므로 작동하지 않습니다.

예 :

step := 0.1 
value := 9.99 

if int(value/step) % 1 == 0 { 
    printf("has two decimal places!") 
} 

컴파일러 오류 : 우리는 동적 값을 사용하는 경우 constant 9.99 truncated to integer

는 그냥 모든 경우에 true를 돌려줍니다.

그래서 소수점 이하 자릿수를 계산하는 적절한 방법은 무엇입니까?

답변

2

int 값 % 1이 항상 0입니다!

value := float32(9.99) 
valuef := value*100 
extra := valuef - float32(int(valuef)) 
if extra < 1e-5 { 
    fmt.Println("has two decimal places!"); 
} 

http://play.golang.org/p/LQQ8T6SIY2

업데이트

package main 

import (
    "math" 
) 

func main() { 
    value := float32(9.9990001) 

    println(checkDecimalPlaces(3, value)) 
} 

func checkDecimalPlaces(i int, value float32) bool { 
    valuef := value * float32(math.Pow(10.0, float64(i))) 
    println(valuef) 
    extra := valuef - float32(int(valuef)) 

    return extra == 0 
} 

http://play.golang.org/p/jXRhHsCYL-

+0

더 역동적으로 만들 수 있습니까? 어떻게 동적 인 단계가있는 함수로 보입니까? 당신의 예제에서는'100'과'1e-5'를 하드 코딩해야합니다. – bodokaiser

+0

@bodokaiser 업데이트를 참조하십시오. 그러나 값이 9.990000001과 같이 9.99에 매우 근접한 경우 실패합니다. – chendesheng

+0

감사합니다. 질문을 조금이라도 남겨두면 신경 쓰지 마라. 나중에 나는 그것을 나중에 표시하고있다 :) – bodokaiser

1

당신은 그것을 속임수를 가지고 별도의 변수를 추가

step := 0.1 
value := 9.99 
steps := value/step 
if int(steps)%1 == 0 { 
    fmt.Println("has two decimal places!") 
} 

을 또는 당신이 int로 변환하기 전에 단계를 던져 같은 :

int(float64(value/step)) 

playground

// 편집

해킹되지 않는 수학적인 방법은 예를 들어, 문자열로 실온하고 분할 :

func NumDecPlaces(v float64) int { 
    s := strconv.FormatFloat(v, 'f', -1, 64) 
    i := strings.IndexByte(s, '.') 
    if i > -1 { 
     return len(s) - i - 1 
    } 
    return 0 
} 

playground

// 사소한 최적화 업데이트

+0

이 항상 작동하지 않습니다 : HTTP : //play.golang

나는 다른 방법을 제안한다. org/p/_GVGeUs5cO – bodokaiser

+0

업데이트를 확인하고 파이썬/자바 스크립트에서 "해킹"버전을 추가했습니다. – OneOfOne