MST

星途 面试题库

面试题:Go中如何理解浮点型的舍入误差及简单处理

在Go语言中,已知 `var num1 float64 = 0.1` 和 `var num2 float64 = 0.2`,当执行 `num3 := num1 + num2` 时,预期结果应该是0.3,但实际可能并非如此。请解释产生这种舍入误差的原因,并说明一种简单的处理方式来尽量接近正确结果。
19.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

舍入误差原因

在计算机中,浮点数采用二进制表示。像 0.10.2 这样的十进制小数,无法精确地用二进制表示。

例如,0.1 的二进制表示是一个无限循环小数:0.0001100110011...,在有限的内存空间中存储时,会进行近似截断,导致精度损失。当 num1num2 相加时,这种精度损失会累积,使得结果与预期的 0.3 有偏差。

简单处理方式

可以使用 math/big 包中的 Float 类型,它能提供更高的精度。示例代码如下:

package main

import (
    "fmt"
    "math/big"
)

func main() {
    num1 := big.NewFloat(0.1)
    num2 := big.NewFloat(0.2)
    num3 := new(big.Float).Add(num1, num2)
    result, _ := num3.Float64()
    fmt.Println(result)
}

在上述代码中,big.NewFloat 函数创建高精度的 Float 对象,Add 方法进行高精度加法运算,最后通过 Float64 方法转换回普通的 float64 类型。这样可以尽量接近正确结果。