Home >Backend Development >Golang >How to Print Float64 Numbers in Go with Fixed Width and Maximum Significant Digits?

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

Barbara Streisand
Barbara StreisandOriginal
2024-12-04 01:47:10626browse

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

Printing Float64 Numbers with Fixed Width and Significant Digits

Imagine you need to print float64 numbers in a table with a fixed width of 12 characters and the maximum possible number of significant digits. Consider the following examples:

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"

As you can see, the default fmt.Printf function with the .6g format specifier may either truncate significant digits or use scientific notation, resulting in loss of precision. Is there a way to achieve our desired formatting using standard library functions?

Custom Formatting to the Rescue

There is no straightforward standard library function that exactly meets our requirements. However, we can develop a custom formatting function that takes the desired width and maximum significant digits into account. Here's how we approach this:

  1. Check if the number is greater than or equal to 1e12 since this is the turning point between regular form and scientific notation.
  2. For the regular form, determine the number of fraction digits that fit within the desired width. Construct the format string accordingly using Sprintf to specify both the width and precision.
  3. For scientific notation, check the exponent's width (e.g., e 1, e 10, e 100) and calculate the maximum possible precision for the fraction part within the remaining width.

Here's an example implementation in 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)
}

Testing this function with various float64 values yields the following output:

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

This demonstrates how to print float64 numbers in a fixed width with the maximum possible number of significant digits using custom formatting.

The above is the detailed content of How to Print Float64 Numbers in Go with Fixed Width and Maximum Significant Digits?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn