Как вычислить число с плавающей запятой с заданными десятичными разрядами?

#go

#Вперед

Вопрос:

Мне нужен алгоритм для вычисления числа с плавающей запятой с учетом числа int и десятичных разрядов.

Вот пара примеров, чтобы понять, что я имею в виду:

  • Amount = 484, DecimalPlaces = 0 должно возвращать «484»
  • Amount = 484, DecimalPlaces = 1 должно возвращать «48.4»
  • Amount = 484, DecimalPlaces = 2 должно возвращать «4,84»
  • Amount = 484, DecimalPlaces = 3 должно возвращать «0,484»
  • Amount = 484, DecimalPlaces = 4 должно возвращать «0.0484»
  • Amount = 484, DecimalPlaces = 5 должно возвращать «0.00484»

У меня уже есть алгоритм, но я не знаю, как решить часть с начальными нулями.

Это мой подход (я использую golang кстати):

 func GetAmount(amount, places int) string {
    runes := []rune(strconv.Itoa(amount))
    result := ""
    for j := len(runes) - 1; j >= 0; j-- {
        result = string(runes[j])   result
        if j == len(runes)-places {
            result = "."   result
        }
    }   
    return result
}
  

Заранее спасибо!

Комментарии:

1. Используйте places для вычисления разделителя и строки формата. Смотрите play.golang.org/p/TjN4OrcDwy4

2. Отличное решение! транки @Eelco

Ответ №1:

Может быть не самым эффективным, но вот однострочный:

 func GetAmount(amount, places int) string {
    return fmt.Sprintf("%.*f", places, float64(amount)/math.Pow10(places))
}
  

https://play.golang.org/p/ppipUqX9eSF

РЕДАКТИРОВАТЬ: H / T к @perreal для предложения в одну строку!

Комментарии:

1. Приятно, 1 за использование math.Pow . Намного элегантнее, чем у меня.

2. @Eelco Я ощетинился при использовании math вообще … проверяя документы, которые я обнаружил Pow10 ! Обновленный ответ, отражающий эту оптимизацию.

3. У вас может быть переменная для точности после точки: return fmt.Sprintf("%.*f", places, float64(amount)/math.Pow10(places))