首頁 >後端開發 >Golang >如何在 Go 中列印固定寬度和最大有效位數的 Float64 數字?

如何在 Go 中列印固定寬度和最大有效位數的 Float64 數字?

Barbara Streisand
Barbara Streisand原創
2024-12-04 01:47:10662瀏覽

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

列印具有固定寬度和有效數字的Float64 數字

假設您需要在固定寬度為12 個字元的表格中列印float64 數字以及最大可能的有效數字位數。請考慮以下範例:

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"

如您所見,帶有 .6g 格式說明符的預設 fmt.Printf 函數可能會截斷有效數字或使用科學記數法,從而導致精確度損失。有沒有辦法使用標準函式庫函數來實現我們想要的格式?

自訂格式來救援

沒有一個簡單的標準函式庫函數可以完全滿足我們的要求。但是,我們可以開發一個自訂格式化函數,將所需的寬度和最大有效數字納入考量。我們的處理方法如下:

  1. 檢查數字是否大於或等於 1e12,因為這是正規形式和科學記數法之間的轉折點。
  2. 對於正規形式,決定適合所需寬度的小數位數。使用 Sprintf 相應地建構格式字串來指定寬度和精度。
  3. 對於科學記數法,檢查指數的寬度(例如 e 1、e 10、e 100)併計算分數的最大可能精度剩餘寬度內的部分。

這是一個範例實作Go:

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)
}

使用各種float64 值測試此函數會產生以下輸出:

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

這示範了如何以固定寬度列印float64 數字,並具有最大可能的有效數量使用自訂格式的數字。

以上是如何在 Go 中列印固定寬度和最大有效位數的 Float64 數字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn