Преобразование любого числа с плавающей точкой в целое число всегда приводит к целому числу. Я не уверен, ожидали ли вы десятичного вывода или неправильно набрали свой вопрос.
Причина, по которой ваш пример округляется вверх, была объяснена в других ответах и комментариях и связана с вашим вводом, превышающим точность float64. Если вы удалите одну из девяток из вашего примера и воспроизведете ее, вы увидите, что значение не округляется в большую сторону.
При работе с числами, выходящими за пределы float64, вы можете использовать библиотеку math / big .
Нечто подобное должно дать ожидаемый результат.
package main
import (
"math/big"
"log"
)
func main() {
bigFloatStr := "999999999.99999999"
bigFloat, _ := new(big.Float).SetString(bigFloatStr)
multiplier := new(big.Float).SetInt64(100000000)
result := new(big.Float)
result.Mul(bigFloat, multiplier)
bigInt := new(big.Int)
result.Int(bigInt)
intVal := bigInt.Int64()
log.Println(bigFloat)
log.Println(result)
log.Println(bigInt)
log.Println(intVal)
}
Вывод:
2009/11/10 23:00:00 9.9999999999999999e+08
2009/11/10 23:00:00 9.9999999999999999e+16
2009/11/10 23:00:00 99999999999999999
2009/11/10 23:00:00 99999999999999999
https://play.golang.org/p/w4fMuPE1ADf