Подтвердить что ты не робот

Как форматировать числа с плавающей запятой в строку с помощью Go

Используя Go, я пытаюсь найти "лучший" способ отформатировать число с плавающей запятой в строку. Я искал примеры, однако я не могу найти ничего, что конкретно отвечает на мои вопросы. Все, что я хочу сделать, это использовать "лучший" метод для форматирования числа с плавающей запятой в строку. Количество десятичных разрядов может варьироваться, но будет известно (например, 2 или 4 или ноль). Ниже приведен пример того, чего я хочу достичь.

На основании приведенного ниже примера я должен использовать fmt.Sprintf() или strconv.FormatFloat() или что-то еще?

И каково нормальное использование каждого из них и чем оно отличается?

Я также не понимаю значимости использования 32 или 64 в следующем, который в настоящее время имеет 32:

strconv.FormatFloat(float64(fResult), 'f', 2, 32)

Пример:

package main

import (
    "fmt"
    "strconv"
)

func main() {

    var (
        fAmt1 float32 = 999.99
        fAmt2 float32 = 222.22
    )

    var fResult float32 = float32(int32(fAmt1*100) + int32(fAmt2*100)) / 100

    var sResult1 string = fmt.Sprintf("%.2f", fResult)

    println("Sprintf value = " + sResult1)

    var sResult2 string = strconv.FormatFloat(float64(fResult), 'f', 2, 32)

    println("FormatFloat value = " + sResult2)

}
4b9b3361

Ответ 1

Оба fmt.Sprintf и strconv.FormatFloat используют ту же строчную процедуру форматирования под обложками, что и те же результаты.

Если точность, в которой число должно быть отформатировано, является переменной, то, вероятно, проще использовать FormatFloat, так как она избегает необходимости создавать строку формата, как и при использовании Sprintf. Если он никогда не изменится, вы можете использовать либо.

Последний аргумент FormatFloat определяет, как значения округляются. Из документации:

Он округляет результат, предполагающий, что оригинал был получен с плавающей запятой значение битов bitSize (32 для float32, 64 для float64)

Итак, если вы работаете с значениями float32, как в вашем примере кода, то передача 32 верна.

Ответ 2

В Go 1.12 (февраль 2019 г.) и проекте cespare/ryu у вас будет более быстрая альтернатива strconv:

Ryu - это Go-реализация Ryu, быстрого алгоритма преобразования чисел с плавающей точкой в строки.
Это довольно прямой перевод Go библиотеки Ulf Adams C.

Задержка strconv.FormatFloat составляет бимодальный из-за нечасто взятого медленного пути, который на несколько порядков дороже (выпуск 15672).

Алгоритм Рю требует нескольких справочных таблиц.
В библиотеке Ульфа Адамса C реализована оптимизация размера (RYU_OPTIMIZE_SIZE), которая значительно уменьшает размер таблиц float64 в обмен на немного большую стоимость процессора.

Для небольшой доли входных данных Рю дает другое значение, чем strconv для последней цифры.
Это связано с ошибкой в strconv: , выпуск 29491.

Go 1.12 может включать или не включать эту новую реализацию непосредственно в strconv, но если это не так, вы можете использовать этот проект для более быстрого преобразования.