>백엔드 개발 >Golang >Go의 Float64를 고정 너비, 유효 자릿수 보존 문자열로 변환하는 방법은 무엇입니까?

Go의 Float64를 고정 너비, 유효 자릿수 보존 문자열로 변환하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-05 16:34:11357검색

How to Convert Go's Float64 to Fixed-Width, Significant-Digit-Preserving Strings?

부동 소수점 숫자를 고정 너비의 유효 자릿수 보존 문자열로 변환

질문:

Go에 변환하는 표준 라이브러리 함수가 있나요? 부동 소수점 숫자(float64)를 고정 너비의 문자열로 변환하여 최대 유효 자릿수를 보존하시겠습니까?

답변:

Go 표준 라이브러리는 다음을 제공하지 않습니다. 이 목적을 위한 전용 기능을 사용하면 원하는 형식을 달성하기 위한 맞춤형 솔루션을 구현할 수 있습니다.

접근 방식에는 다음을 기반으로 한 분기가 포함됩니다. float64 숫자의 값입니다. 1e12보다 크거나 같은 숫자의 경우 과학적 표기법 형식이 사용됩니다. 1e12보다 작은 숫자의 경우 일반 형식이 사용됩니다.

두 경우 모두 원하는 12자 너비에 맞추는 데 필요한 분수 자릿수를 결정하기 위해 예비 형식 지정이 수행됩니다. 그런 다음 계산된 정밀도를 사용하여 최종 형식 문자열이 구성됩니다.

코드 조각:

// format12 formats x to be 12 chars long.
func format12(x float64) string {
    if x >= 1e12 {
        // Check to see how many fraction digits fit in:
        s := fmt.Sprintf("%.g", x)
        format := fmt.Sprintf("%%12.%dg", 12-len(s))
        return fmt.Sprintf(format, x)
    }

    // Check to see how many fraction digits fit in:
    s := fmt.Sprintf("%.0f", x)
    if len(s) == 12 {
        return s
    }
    format := fmt.Sprintf("%%%d.%df", len(s), 12-len(s)-1)
    return fmt.Sprintf(format, x)
}

테스트 사례 및 출력:

fs := []float64{0, 1234.567890123, 0.1234567890123, 123456789012.0, 1234567890123.0,
    9.405090880450127e+9, 9.405090880450127e+19, 9.405090880450127e+119}

for _, f := range fs {
    fmt.Println(format12(f))
}

출력:

0.0000000000
0.1234567890
1234.5678901
123456789012
1.234568e+12
9405090880.5
9.405091e+19
9.40509e+119

위 내용은 Go의 Float64를 고정 너비, 유효 자릿수 보존 문자열로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.