问下各位大佬,Golang Go语言中 float32 和 float64 的精度问题

发布于 1周前 作者 bupafengyu 来自 Go语言

菜鸟一只,这个‘大约 6 个十进制数的精度’ 和 ‘15 个十进制数的精度’ 咋理解,精度还能这么按个算,完全不理解


问下各位大佬,Golang Go语言中 float32 和 float64 的精度问题
11 回复

就是可以精确到小数点后面第几位的意思

更多关于问下各位大佬,Golang Go语言中 float32 和 float64 的精度问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


参考 IEEE754 标准,尾数有多少位,精度就到 2 的负多少次方。算下来大概 4 字节浮点数就是七八位,8 字节浮点数就是十五六位

科学计数法,十的几次方前面乘的那个数。

楼上的没说对 并不是小数点后多少位,而是整数+小数部分总共多少位
因为计算机一个变量类型可使用的字节数有限(比如 int 只有 4 字节),所以只能存储有限位数的小数

比如 1 个十进制数的精度下,0.1 和 0.2 是两个数字,0.11 和 0.12 是一个数字(由于精度不足导致无法分别他们的差异)。

盲猜原文是 6 decimal precision

这个的正常翻译是 6 十进制精度

就是数学里 有效数字 的概念,从首位非 0 的数字开始算起。
非规格化的 float32 至少能表示 6 位有效数字,规格化的 float32 至少能表示 7 位有效数字。
可以看看这个
https://www.cnblogs.com/tsingke/p/10223183.html

单精度浮点数,尾数占 23 bit ,1<<23 对应十进制是 8388608 ,所以,单精度浮点数有效小数位 6 位
双精度浮点数,尾数占 52 bit ,1<<52 对应十进制是 4503599627370496 ,因此有效小数位是 15 位。

谢谢各位大佬,明白了,根据 IEEE754 规定

单精度浮点数(float32)占用 4 个字节( 32 位)存储空间,包括符号位 1 位,阶码 8 位(指数部分),尾数 23 位。其数值范围为-3.4E38 ~ 3.4E38 ,单精度浮点数最多有 7 位十进制有效数字

双精度浮点数(float64)占用 8 个字节( 64 位)存储空间,包括符号位 1 位,阶码 11 位(指数部分),尾数 52 位。其数值范围为-1.7E-308 ~ 1.7E+308 ,双精度浮点数最多有 15 或 16 位十进制有效数字

不是小数点后多少位,是总共多少位。

在Go语言中,float32float64是两种表示浮点数的类型,它们的主要区别在于精度和存储需求。

  1. 精度

    • float32:占用4个字节(32位),遵循IEEE-754标准,其精度大约是7位十进制数。这意味着,当使用float32存储或计算浮点数时,大约7位十进制数字之后可能会出现精度损失或舍入误差。
    • float64:占用8个字节(64位),同样遵循IEEE-754标准,但精度大约是15位十进制数。因此,float64能提供更高的精度,适用于需要更高数值准确性的场景。
  2. 使用场景

    • 如果你的应用对内存使用有严格要求,且不需要非常高的数值精度,可以选择float32
    • 大多数需要高精度计算的场景,如科学计算、金融应用等,建议使用float64以确保数值的准确性。
  3. 注意事项

    • 无论使用float32还是float64,都应意识到浮点数运算的固有不确定性,特别是在进行连续运算或比较时。
    • 在涉及货币计算的金融应用中,通常建议使用整数类型(如int64)来表示最小货币单位(如分),以避免浮点数舍入误差。

总之,在选择float32还是float64时,应根据应用的具体需求(如内存使用、数值精度要求)来决定。

回到顶部