涉及浮点数(float32或float64)计算的坑

package main

import "fmt"

func main() {
   num1 := 5 / 2                                // var num1 int = 5 / 2
   fmt.Printf("num1(%T) is %+v \n", num1, num1) // num1(int) is 2
   // 重要提醒:Go语言没有隐式转换,这里也不会推导出num1为浮点数

   num2 := float64(5 / 2)                       // var num2 float64 = float64(5 / 2)
   fmt.Printf("num2(%T) is %+v \n", num2, num2) // num2(float64) is 2

   num3 := float64(5) / 2                       // var num3 float64 = float64(5) / 2
   fmt.Printf("num3(%T) is %+v \n", num3, num3) // num3(float64) is 2.5

   num4 := 5 / float64(2)                       // var num4 float64 = 5 / float64(2)
   fmt.Printf("num4(%T) is %+v \n", num4, num4) // num4(float64) is 2.5

   num5 := float64(5) / float64(2)              // var num5 float64 = float64(5) / float64(2)
   fmt.Printf("num5(%T) is %+v \n", num5, num5) // num5(float64) is 2.5

   var num6 float64 = 5 / 2                     // var num6 float64 = 5 / 2
   fmt.Printf("num6(%T) is %+v \n", num6, num6) // num6(float64) is 2
   // 重要提醒:这里只是把计算结果整数2转为浮点数2,并不是我们期望的结果
}

// ========== 总结 ========== //
// 1、Go语言没有隐式转换,所以两个整数求商一定要特别注意,如果商是小数,那么小数部分会被丢弃,最终结果也是整数,而不是浮点
//    数,哪怕保存最终结果的变量显式声明为浮点数也没用。(参考num1和num6的计算)
// 2、如果最终计算结果可能为浮点数,那么最安全的办法是先将其中一个操作数或全部操作数转为浮点数,然后再进行计算。

Copyright © 2024 码农人生. All Rights Reserved