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位
,也就意味着可以表示的范围更大了。
热门推荐
超声-回弹综合法检测混凝土强度现场检测快速指南
证据收集与固定:案例研究
慢性支气管炎急性加重期治疗包括
儿童肠梗阻:分类、症状与诊断全解析
光伏电站发电量的秘密:组件安装倾角与朝向的影响(内含安装倾角速查表)
斯坦福实验揭示:时间管理的3个核心,拉开孩子10年后的阶层差距
“跟着电影去炒股”到底靠不靠谱?《哪吒2》带飞光线传媒,华谊兄弟曾经翻车
男孩寓意好的英文名有哪些
横突骨折怎样恢复得快
手机色彩设置教程:如何调整手机色彩模式、色温及其他高级设置?
一个像素占多少bit
简历上的离职原因怎么写
北海道5日游攻略:深度体验与经典路线一站式指南
房屋什么朝向好,打造理想居家环境
为什么有白天和黑夜呢——探索地球自转与昼夜更替的奥秘
探访玉环旅游胜地:欣赏自然风光与历史文化遗迹的十个必游景点
《黑神话悟空》美术总监杨奇不当言论引发舆论风波
英语四六级没有过,对考研的影响到底有多大?
四级考试听力备考的必读手册
正畸神器——支抗钉,这9个问题一定要知道
羽绒服选购保养指南:从填充物到清洗方法全解析
孔子为什么会独“与点也”
客户如何细分管理
针灸减肥:传统医学的体重管理新策略
书香唐山|信宝忠:以“唐山”冠名的五座火车站
上海2025年考研成绩复核详细时间及流程
带状疱疹眼部治疗方法
MySQL官方示例数据库详解
剑网3缘起藏剑攻略 新手藏剑技能玩法介绍
汽车OTA升级:提升下载与升级速度,优化用户体验