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位,也就意味着可以表示的范围更大了。
热门推荐
DP还是HDMI?RTX 50系显卡接口选择指南
梦见故人:心理学与文化传统的双重解读
如何制定有效的项目风险管控方案?【详细指南】
再生抗衰管理项目怎么做
牙周病饮食攻略:5大护齿营养素,强化牙龈防线!
电动汽车充电站:时间成本与便利性
美国三大证券交易所:纽交所、纳斯达克、美交所
大罗否定C罗自称史上最佳 梅西跻身三大球王 C罗排名4-9之间
C罗40岁生日快乐!五大射手纪录无人能敌!仅剩一大梦想
婚后房产证加名、婚前房产归属及未婚先孕责任认定
刀柄的设计对刀具的平衡性有何影响?
设计模式及其在项目、框架中的应用
UML(统一建模语言)及其图例使用指南
NB-IoT开发必备:SIM卡、USIM卡、UICC卡、eSIM卡的区别详解
抗坏血酸是什么
肉毒素能去除颈部皱纹吗 如何去除颈部皱纹
如何通过DevOps实现持续集成和持续交付?
如何通过DevOps原则提升团队协作和自动化效率?
拖把布清洁布材料选择与性能评估
小孩舌苔发黄怎么办?四种实用解决方案
怎么观察舌苔
如何在虚拟机中安装ie浏览器
文摘型数据库有哪些
在国外非法务工如何处罚
图说:B-4重型榴弹炮 二战苏联最有效的武器 拯救数千士兵的生命
二战意大利最好的重炮,M1935式210毫米重炮
横向刷牙、大力刷牙、牙刷过硬......错误的刷牙方式,让牙齿很受伤!
核心睡眠和深度睡眠
如何应对结构化面试?锦囊送上→
“超龄”劳动者遇上交通事故,能主张赔偿误工费吗?