面试题答案
一键面试- 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}$。
- float32:
- 浮点型运算精度丢失问题举例
在上述代码中,我们期望$0.1 + 0.2$的结果是$0.3$,但由于浮点数在计算机中以二进制表示,$0.1$和$0.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 }
- 避免精度丢失问题的方法
- 使用整数运算:
- 如果涉及金额等对精度要求极高的场景,可以将金额单位转换为最小单位(如分),然后使用整数进行运算,最后再转换回原来的单位。
- 例如:计算1.23元 + 4.56元,可以先将其转换为123分 + 456分,运算结果为579分,再转换回5.79元。
- 使用高精度库:
- Go语言中有一些高精度运算库,如
math/big
包。它提供了Float
类型,可以进行高精度浮点数运算。 - 示例代码如下:
- Go语言中有一些高精度运算库,如
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 }
- 使用整数运算: