[已解决]Golang中浮点数值无法显示的问题
[已解决]Golang中浮点数值无法显示的问题 我正在尝试编写一个函数,该函数接收两个切片,将每个切片的元素相加后存入第三个切片,然后返回:包含两个切片各元素相加结果的新切片、第三个切片中元素的总和以及平均值。
我注意到尽管平均值被声明为浮点数,但并未显示浮点数值。 因此我移除了函数,将所有计算放在主函数中执行。结果仍然相同。 我有两个问题:
- 我哪里做错了?
- 如果某个功能在函数中无法正常工作,将其写入主循环并尝试排查问题是否是一种好的调试方法?当然这不适用于所有情况,但在可能的情况下,这样做是否是排查问题的好方法?
以下是代码:
package main
import "fmt"
func main() {
myFirstSlice := []int{1, 2, 3, 4, 5, 6}
mySecondSlice := []int{7, 8, 9, 10, 11, 15}
sliceSumOfElements := make([]int, len(myFirstSlice))
var sumOfElements int
var avgOfSumOfElements float32
for index, _ := range sliceSumOfElements {
sliceSumOfElements[index] = myFirstSlice[index] + mySecondSlice[index]
sumOfElements += sliceSumOfElements[index]
}
avgOfSumOfElements = float32(sumOfElements / len(sliceSumOfElements))
fmt.Println(sliceSumOfElements, sumOfElements, len(sliceSumOfElements), avgOfSumOfElements)
}
以下是输出结果:
>go run main.go
[8 10 12 14 16 21] 81 6 13
更多关于[已解决]Golang中浮点数值无法显示的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你正在进行整数除法,然后将结果转换为浮点数,但实际上你需要将除法运算的两个部分都转换为浮点数,然后进行除法运算才能得到浮点数除法的结果。
更多关于[已解决]Golang中浮点数值无法显示的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我怀疑自己做了件极其愚蠢的事,结果确实如此。感谢您的耐心🙂
于是我将这段代码:
avgOfSumOfElements = float32(sumOfElements) / len(sliceSumOfElements))
改成了这样:
avgOfSumOfElements = float32(sumOfElements) / float32(len(sliceSumOfElements))
然后它就正常工作了。
问题出在计算平均值时的整数除法上。在Go语言中,整数除法会截断小数部分,导致精度丢失。
具体来说,这行代码有问题:
avgOfSumOfElements = float32(sumOfElements / len(sliceSumOfElements))
这里 sumOfElements / len(sliceSumOfElements) 先进行整数除法(81 ÷ 6 = 13),然后将结果13转换为float32,所以得到的是13.0而不是13.5。
正确的做法应该是先将其中一个操作数转换为浮点数:
package main
import "fmt"
func main() {
myFirstSlice := []int{1, 2, 3, 4, 5, 6}
mySecondSlice := []int{7, 8, 9, 10, 11, 15}
sliceSumOfElements := make([]int, len(myFirstSlice))
var sumOfElements int
var avgOfSumOfElements float32
for index := range sliceSumOfElements {
sliceSumOfElements[index] = myFirstSlice[index] + mySecondSlice[index]
sumOfElements += sliceSumOfElements[index]
}
// 正确的平均值计算方式
avgOfSumOfElements = float32(sumOfElements) / float32(len(sliceSumOfElements))
fmt.Println(sliceSumOfElements, sumOfElements, len(sliceSumOfElements), avgOfSumOfElements)
}
输出结果:
[8 10 12 14 16 21] 81 6 13.5
关于第二个问题:将功能从函数移到主函数中进行调试是有效的排查方法。这有助于隔离问题,确定是函数逻辑错误还是其他因素导致的。在确认问题后,可以重构回函数形式。

