Как форматировать числа с плавающей запятой в строку с помощью 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)
}
Ответы
Ответ 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, но если это не так, вы можете использовать этот проект для более быстрого преобразования.