Go语言中的浮点型数据类型详解
创作时间:
作者:
@小白创作中心
Go语言中的浮点型数据类型详解
引用
CSDN
1.
https://blog.csdn.net/shinamshiro/article/details/138135494
浮点型
浮点数是计算机中小数的表示方式,例如:3.14
Go语言中提供了两种浮点型:
float32(单精度浮点数)
总位数:32位
结构:1位符号位(S),8位指数位(E),23位尾数位(M)
表示范围:约 ±1.18 × 10^-38 到 ±3.40 × 10^38
float64(双精度浮点数)
总位数:64位
结构:1位符号位(S),11位指数位(E),52位尾数位(M)
表示范围:约 ±2.23 × 10^-308 到 ±1.80 × 10^308
例如:
package main
import "fmt"
func main() {
var v1 float32
v1 = 3.14
v2 := 99.9
v3 := float64(v1) + v2
fmt.Println(v1, v2, v3)
}
非精确
浮点类型在计算机中表示小数时是非精确的,例如:
package main
import "fmt"
func main() {
var v1 float32
v1 = 3.14
v2 := 99.9
v3 := float64(v1) + v2
fmt.Println(v1, v2, v3)
v4 := 0.1
v5 := 0.2
result := v4 + v5
fmt.Println(result)
v6 := 0.3
v7 := 0.2
data := v6 + v7
fmt.Println(data)
}
输出结果:
3.14 99.9 103.04000010490418
0.30000000000000004
0.5
float底层存储原理
以var price float32 = 0.29为例:
第一步:浮点型转换为二进制
整数部分,直接转换为二进制(10进制转换为2进制),即:
100111小数部分,让小数部分乘以2,结果小于1则将结果继续乘以2,结果大于1则讲结果-1继续乘以2,结果等于1则结束。
0.29 * 2 = 0.58 // 小于1,则继续乘
0.58 * 2 = 1.16 // 大于1,则减1继续乘
0.16 * 2 = 0.32 // 小于1,则继续乘
0.32 * 2 = 0.64 // 小于1,则继续乘
0.64 * 2 = 1.28 // 大于1,则减1继续乘
0.28 * 2 = 0.56 // 小于1,则继续乘
0.56 * 2 = 1.12 // 大于1,则减1继续乘
0.12 * 2 = 0.24 // 小于1,则继续乘
0.24 * 2 = 0.48 // 小于1,则继续乘
0.48 * 2 = 0.96 // 小于1,则继续乘
0.96 * 2 = 1.92 // 大于1,则减1继续乘
0.92 * 2 = 1.84 // 大于1,则减1继续乘
0.84 * 2 = 1.68 // 大于1,则减1继续乘
0.68 * 2 = 1.36 // 大于1,则减1继续乘
0.36 * 2 = 0.72 // 小于1,则继续乘
0.72 * 2 = 1.44 // 大于1,则减1继续乘
0.44 * 2 = 0.88 // 小于1,则继续乘
0.88 * 2 = 1.76 // 大于1,则减1继续乘
0.76 * 2 = 1.52 // 大于1,则减1继续乘
0.52 * 2 = 1.04 // 大于1,则减1继续乘
0.04 * 2 = 0.08 // 小于1,则继续乘
0.08 * 2 = 0.16 // 小于1,则继续乘
0.16 * 2 = 0.32 // 小于1,则继续乘(与第三行相同,这样会一直循环执行下去)
...
将相乘之后等结果的整数部分拼接起来,所以 0.29的 二进制表示:010010100011110101110000101000111...
所以,最终39.29的二进制表示为:100111.010010100011110101110000101000111...
第二步:科学计数法表示
`100111.010010100011110101110000101000111...`
1.00111010010100011110101110000101000111… * 2^5
第三步:存储
以float32为例来进行存储,用32位来存储浮点型。
- sign:用1位来表示浮点数正负,0表示正数;1表示负数。
- exponent:用8位来表示共有256种(0~255),含正负值(-127 ~ 128)。例如:5想要存储到exponent位的话,需要让 5 + 127 = 132,再讲132转换二进制,存储到exponent。(132的二进制是:01000010)
- fraction:存储小数点后的所有数据。
float64和float32类似,只是用于表示各部分的位数不同而已,其中:sign=1位、exponent=11位、fraction=52位,也就意味着可以表示的范围更大了。
热门推荐
怡口净水器安装全攻略:从选购到维护的实用指南
什么动物吃水母?深入探讨水母的捕食者
藏在瑞丽傣乡里的传统米食文化
综艺追赶“文化风味”,带动文旅发展
一粒米的万年行旅:从浙江上山到世界稻源
2024 年排名前 10 位的女性动漫角色
沉浸式艺术:民间传说的数字化传承新路径
中国文化出海“新三样”能否助力旅游出圈海外?
如何通过情感化用户界面(UI)设计提升品牌亲和力:创造触动人心的数字体验
玉龙雪山2月份去行吗?2月份去玉龙雪山带什么衣服穿什么衣服?
小心!这些验证码陷阱你踩过吗?
手机验证码丢了?教你快速找回!
九年义务教育如何守护学生心理健康?
家庭泡发海参完全指南:从选购到食用的详细步骤
大美溱湖“迎春绽放” 2024泰州姜堰溱潼会船开篙
十里溱湖龙舟竞渡 文旅融合奋楫扬帆
从职业规划角度看在职博士申请的必要性与价值
鸡蛋,真是脑梗的催发剂吗?医生:不想血管堵塞,3物能不碰就不碰
养血管、防脑梗,记好4字
王殿武:提升认知的核心是建立认知模型,如何建立自己的认知模型
成都赶场打卡:青羊宫、锦里、宽窄巷子必逛!
成都十大景区,带你领略真实天府之国
喜鹊元素如何玩转现代设计?从家居到服饰,这些创意设计令人眼前一亮
故宫博物院推荐:喜鹊登枝的文化宝藏
家里有壁虎?别急!听听专家怎么说
斯坦福大学揭秘:壁虎如何在墙上停留的秘密
林芝至纳木错自驾游:避坑省钱全攻略!
对待非遗文化应该如何进行传承和保护?
暖色墙面真的能让你心情更愉悦吗?
餐厅墙面装饰的风水小窍门