令人惊讶的是,我找不到其他人遇到同样的问题;我尝试简单地在Go中初始化一个float64并进行打印,然后尝试进行字符串转换并进行打印。两种输出都不准确。
我已经尝试了很多分数,包括那些不解析为重复小数的分数,以及简单地写出浮点数和打印(例如,num := 1.5
然后fmt.Println(num)
给出输出{{ 1}})。
1
预期:
package main
import (
"fmt"
"strconv"
)
func main() {
var num float64
num = 5/3
fmt.Printf("%v\n", num)
numString := strconv.FormatFloat(num, 'f', -1, 64)
fmt.Println(numString)
}
实际:
// Output:
1.66
1.66
答案 0 :(得分:4)
The Go Programming Language Specification
整数文字是代表整数的数字序列 常数。
浮点文字是a的十进制表示形式 浮点常量。它具有整数部分,小数点, 小数部分和指数部分。整数和小数部分 包含十进制数字;指数部分是e或E,后跟一个 (可选)带符号的十进制指数。整数部分之一或 小数部分可能会被删除;小数点之一或 指数可能会消失。
对于两个整数值x和y,整数商q = x / y和 余数r = x%y满足以下关系:
x = q*y + r and |r| < |y|
x / y截断为零。
您使用整数文字和算术(x / y截断为零)编写:
package main
import (
"fmt"
"strconv"
)
func main() {
var num float64
num = 5 / 3 // float64(int(5)/int(3))
fmt.Printf("%v\n", num)
numString := strconv.FormatFloat(num, 'f', -1, 64)
fmt.Println(numString)
}
游乐场:https://play.golang.org/p/PBqSbpHvuSL
输出:
1
1
您应该使用浮点文字和算术来编写:
package main
import (
"fmt"
"strconv"
)
func main() {
var num float64
num = 5.0 / 3.0 // float64(float64(5.0) / float64 (3.0))
fmt.Printf("%v\n", num)
numString := strconv.FormatFloat(num, 'f', -1, 64)
fmt.Println(numString)
}
游乐场:https://play.golang.org/p/Hp1nac358HK
输出:
1.6666666666666667
1.6666666666666667