MST

星途 面试题库

面试题:Go语言中浮点型数据的精度问题

在Go语言中,float32和float64的精度范围分别是多少?请举例说明在使用浮点型进行运算时可能出现的精度丢失问题,并阐述如何尽量避免这类问题。
32.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. float32和float64的精度范围
    • float32
      • 精度:大约6 - 7位十进制数字精度。它使用32位来表示,其中1位用于符号,8位用于指数,23位用于尾数。
      • 范围:大约从$1.4×10^{-45}$到$3.4×10^{38}$。
    • float64
      • 精度:大约15 - 17位十进制数字精度。它使用64位来表示,其中1位用于符号,11位用于指数,52位用于尾数。
      • 范围:大约从$4.9×10^{-324}$到$1.8×10^{308}$。
  2. 浮点型运算精度丢失问题举例
    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var num1 float64 = 0.1
        var num2 float64 = 0.2
        result := num1 + num2
        fmt.Printf("%.20f\n", result)
        // 预期结果为0.3,但实际输出为0.30000000000000004
    }
    
    在上述代码中,我们期望$0.1 + 0.2$的结果是$0.3$,但由于浮点数在计算机中以二进制表示,$0.1$和$0.2$在二进制中无法精确表示,导致运算结果与预期有偏差。
  3. 避免精度丢失问题的方法
    • 使用整数运算
      • 如果涉及金额等对精度要求极高的场景,可以将金额单位转换为最小单位(如分),然后使用整数进行运算,最后再转换回原来的单位。
      • 例如:计算1.23元 + 4.56元,可以先将其转换为123分 + 456分,运算结果为579分,再转换回5.79元。
    • 使用高精度库
      • Go语言中有一些高精度运算库,如math/big包。它提供了Float类型,可以进行高精度浮点数运算。
      • 示例代码如下:
    package main
    
    import (
        "fmt"
        "math/big"
    )
    
    func main() {
        num1 := big.NewFloat(0.1)
        num2 := big.NewFloat(0.2)
        result, _ := num1.Add(num1, num2).Float64()
        fmt.Printf("%.20f\n", result)
        // 结果更接近预期的0.3
    }