Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencetak Nombor Float64 dalam Go dengan Lebar Tetap dan Digit Ketara Maksimum?

Bagaimana untuk Mencetak Nombor Float64 dalam Go dengan Lebar Tetap dan Digit Ketara Maksimum?

Barbara Streisand
Barbara Streisandasal
2024-12-04 01:47:10725semak imbas

How to Print Float64 Numbers in Go with Fixed Width and Maximum Significant Digits?

Mencetak Nombor Float64 dengan Lebar Tetap dan Digit Ketara

Bayangkan anda perlu mencetak nombor float64 dalam jadual dengan lebar tetap 12 aksara dan bilangan maksimum yang mungkin bagi digit bererti. Pertimbangkan contoh berikut:

fmt.Printf("%12.6g\n", 9.405090880450127e+119) //"9.40509e+119"
fmt.Printf("%12.6g\n", 0.1234567890123)        //"    0.123457"
fmt.Printf("%12.6g\n", 123456789012.0)         //" 1.23457e+11"

Seperti yang anda lihat, fungsi fmt.Printf lalai dengan penentu format .6g mungkin sama ada memotong digit bererti atau menggunakan tatatanda saintifik, mengakibatkan kehilangan ketepatan. Adakah terdapat cara untuk mencapai pemformatan yang diingini menggunakan fungsi perpustakaan standard?

Pemformatan Tersuai untuk Penyelamat

Tiada fungsi perpustakaan standard mudah yang betul-betul memenuhi keperluan kami. Walau bagaimanapun, kami boleh membangunkan fungsi pemformatan tersuai yang mengambil kira lebar yang diingini dan digit bererti maksimum. Begini cara kita mendekati perkara ini:

  1. Semak sama ada nombor itu lebih besar daripada atau sama dengan 1e12 kerana ini ialah titik perubahan antara bentuk biasa dan tatatanda saintifik.
  2. Untuk bentuk biasa, tentukan bilangan digit pecahan yang muat dalam lebar yang dikehendaki. Bina rentetan format dengan sewajarnya menggunakan Sprintf untuk menentukan kedua-dua lebar dan kejituan.
  3. Untuk tatatanda saintifik, semak lebar eksponen (cth., e 1, e 10, e 100) dan hitung ketepatan maksimum yang mungkin untuk pecahan bahagian dalam baki lebar.

Berikut ialah contoh pelaksanaan dalam Pergi:

import (
    "fmt"
)

func format12(x float64) string {
    if x >= 1e12 {
        exp := fmt.Sprintf("%.g", x)
        return fmt.Sprintf("%%12.%dg", 12-len(exp))
    }
    s := fmt.Sprintf("%.0f", x)
    if len(s) == 12 {
        return s
    }
    return fmt.Sprintf("%%%d.%df", len(s), 12-len(s)-1)
}

Menguji fungsi ini dengan pelbagai nilai float64 menghasilkan output berikut:

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

Ini menunjukkan cara mencetak nombor float64 dalam lebar tetap dengan bilangan maksimum yang mungkin ketara digit menggunakan pemformatan tersuai.

Atas ialah kandungan terperinci Bagaimana untuk Mencetak Nombor Float64 dalam Go dengan Lebar Tetap dan Digit Ketara Maksimum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn