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