Golang中打印浮点数时为什么会出现%符号?

Golang中打印浮点数时为什么会出现%符号? 嗨,我使用的是搭载M1芯片的MacBook Pro笔记本电脑。如下所示,当我不使用“\n”时,打印结果中会出现一个“%”符号;而当我使用“\n”时,则不会打印出“%”符号。

chap3 % cat main.go
package main

import "fmt"

func main() {
	fmt.Printf("%g", 2.332)
}
chap3 % go run main.go
2.332%
chap3 % vim main.go
chap3 % cat main.go
package main

import "fmt"

func main() {
	fmt.Printf("%g\n", 2.332)
}
chap3 % go run main.go
2.332
chap3 % go version
go version go1.19.2 darwin/arm64

是我做错了什么,还是遗漏了某些细节?


更多关于Golang中打印浮点数时为什么会出现%符号?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

你好 @skillian,感谢你的回复。你说得对。我在这里更新一下,这样如果其他人遇到类似的问题,可以在这里找到答案。

更多关于Golang中打印浮点数时为什么会出现%符号?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请忽略上面的问题。% 是由 zsh 插入的。当我切换到 bash 时,我得到了预期的输出。

package main

import "fmt"

func main() {
	fmt.Printf("%g\n", 2.332)
}
bash-3.2$ go run main.go
2.332bash-3.2$ vim main.go
bash-3.2$ go run main.go
2.332
bash-3.2$

pmu:

fmt.Printf("%g", 2.332)

你好,@pmu,欢迎回到论坛!

这是一个很好的问题。事实证明,正如你在测试不同 shell 时已经发现的那样,这是使用 zsh 导致的现象。如果一个程序没有插入最后的换行符,zsh 会插入一个百分号作为信号,提示用户程序结束时没有换行。bash 不会这样做。

发生这种情况是因为 fmt.Printf("%g", 2.332) 没有包含换行符。为此,你必须使用 fmt.Printf("%g\n", 2.332)

除了 bash 之外,我对其他 shell 并不熟悉,所以很高兴知道我们应该留意这类可能由 zsh 等其他 shell 引起的问题。感谢你的提问和分享答案;也许将来其他人遇到这个问题时,你能帮他们省去一些麻烦!

这是终端行为,不是Go语言的问题。当程序输出没有以换行符结束时,某些终端(如zsh)会显示一个%符号来指示行尾。

你的代码没有错误,两种写法都是正确的:

// 没有换行符 - 终端可能显示%
fmt.Printf("%g", 2.332)

// 有换行符 - 正常显示
fmt.Printf("%g\n", 2.332)

// 或者使用Println自动添加换行
fmt.Println(2.332)

这是终端的视觉提示,表示输出行不完整。在zsh中,这个%符号实际上不属于程序输出,只是终端的标记。你可以通过以下方式验证:

package main

import (
    "fmt"
    "os"
)

func main() {
    // 将输出重定向到文件查看实际内容
    fmt.Fprintf(os.Stdout, "%g", 2.332)
}

运行后检查文件内容,不会包含%符号。

在bash终端中,相同情况会显示不同的提示符(通常是$)。这是终端特性,与Go语言无关。

回到顶部