一开始是直接分割为浮点数和整数,直接想乘,然后精度问题罚了几次就老实了
package main
import (
"fmt"
"strings"
"strconv"
)
func main() {
var sciNotation string
fmt.Scan(&sciNotation)
// 用 e 分割输入字符串
parts := strings.Split(sciNotation, "e")
// 提取底数和指数
base := parts[0]
exponent, _ := strconv.Atoi(parts[1])
// 去掉小数点并记录原始小数点位置
baseParts := strings.Split(base, ".")
integerPart := baseParts[0]
decimalPart := ""
if len(baseParts) > 1 {
decimalPart = baseParts[1]
}
// 合并整数部分和小数部分为一个纯数字字符串
rawNumber := integerPart + decimalPart
originalDecimalPos := len(integerPart)
newDecimalPos := originalDecimalPos + exponent
// 根据新小数点位置构造结果字符串
var result string
if newDecimalPos >= len(rawNumber) {
// 小数点在末尾或超出,直接补零
result = rawNumber + strings.Repeat("0", newDecimalPos-len(rawNumber))
} else if newDecimalPos > 0 {
// 在数字中间插入小数点
result = rawNumber[:newDecimalPos] + "." + rawNumber[newDecimalPos:]
} else {
// 小数点在开头前面,添加前导零
result = "0." + strings.Repeat("0", -newDecimalPos) + rawNumber
}
// 去除尾随的零并格式化输出
if strings.Contains(result, ".") {
result = strings.TrimRight(result, "0")
result = strings.TrimRight(result, ".")
}
fmt.Println(result)
}