当前位置:网站首页>Go 數據類型篇(四)之浮點型與複數類型
Go 數據類型篇(四)之浮點型與複數類型
2022-06-28 03:30:00 【weixin_59284282】
浮點型
浮點型也叫浮點數,用於錶示包含小數點的數據,比如 3.14
、1.00
都是浮點型數據。
浮點數的錶示
Go 語言中的浮點數采用IEEE-754 標准的錶達方式,定義了兩個類型:float32
和 float64
,其中 float32
是單精度浮點數,可以精確到小數點後 7 比特(類似 PHP、Java 等語言的 float
類型),float64
是雙精度浮點數,可以精確到小數點後 15 比特(類似 PHP、Java 等語言的 double
類型)。
在 Go 語言裏,定義一個浮點型變量的代碼如下:
var floatValue1 float32
floatValue1 = 10
floatValue2 := 10.0 // 如果不加小數點,floatValue2 會被推導為整型而不是浮點型
floatValue3 := 1.1E-10
對於浮點類型需要被自動推導的變量,其類型將被自動設置為 float64
,而不管賦值給它的數字是否是用 32 比特長度錶示的。因此,對於以上的例子,下面的賦值將導致編譯錯誤:
floatValue1 = floatValue2 // floatValue2 是 float64 類型
編譯錯誤信息如下:
cannot use floatValue2 (type float64) as type float32 in assignment
必須使用這樣的强制類型轉換才可以:
floatValue1 = float32(floatValue2)
在實際開發中,應該盡可能地使用 float64
類型,因為 math 包中所有有關數學運算的函數都會要求接收這個類型。
浮點數的精度
浮點數不是一種精確的錶達方式,因為二進制無法精確錶示所有十進制小數,比如 0.1
、0.7
這種,下面我們通過一個示例來給大家直觀演示下:
floatValue4 := 0.1
floatValue5 := 0.7
floatValue6 := floatValue4 + floatValue5
注:浮點數的運算和整型一樣,也要保證操作數的類型一致,
float32
和float64
類型數據不能混合運算,需要手動進行强制轉化才可以,這一點和動態語言不同。
你覺得上面計算結果 floatValue6
的值是多少?0.8?不,它的結果是 0.7999999999999999
,這是因為計算機底層將十進制的 0.1
和 0.7
轉化為二進制錶示時,會丟失精度,所以永遠不要相信浮點數結果精確到了最後一比特,也永遠不要比較兩個浮點數是否相等。
浮點數的比較
浮點數支持通過算術運算符進行四則運算,也支持通過比較運算符進行比較(前提是運算符兩邊的操作數類型一致),但是涉及到相等的比較除外,因為我們上面提到,看起來相等的兩個十進制浮點數,在底層轉化為二進制時會丟失精度,因此不能被錶象蒙蔽。
如果一定要判斷相等,下面是一種替代的解决方案:
p := 0.00001
// 判斷 floatValue1 與 floatValue2 是否相等
if math.Dim(float64(floatValue1), floatValue2) < p {
fmt.Println("floatValue1 和 floatValue2 相等")
}
可以看到,我們的解决方案是一種近似判斷,通過一個可以接受的最小誤差值 p
,約定如果兩個浮點數的差值在此精度的誤差範圍之內,則判定這兩個浮點數相等。這個解决方案也是其他語言判斷浮點數相等所采用的通用方案。
複數類型
除了整型和浮點型之外,Go 語言還支持複數類型,與複數相對,我們可以把整型和浮點型這種日常比較常見的數字稱為實數,複數是實數的延伸,可以通過兩個實數(在計算機中用浮點數錶示)構成,一個錶示實部(real),一個錶示虛部(imag),常見的錶達形式如下:
z = a + bi
其中 a、b 均為實數,i 稱為虛數單比特,當 b = 0 時,z 就是常見的實數,當 a = 0 而 b ≠ 0 時,將 z 稱之為純虛數,如果你理解數學概念中的複數概念,這些都很好理解,下面我們來看下複數在 Go 語言中的錶示和使用。
在 Go 語言中,複數支持兩種類型:complex64
(32 比特實部和虛部) 和 complex128
(64 比特實部與虛部),對應的錶示示例如下,和數學概念中的複數錶示形式一致:
var complexValue1 complex64
complexValue1 = 1.10 + 10i // 由兩個 float32 實數構成的複數類型
complexValue2 := 1.10 + 10i // 和浮點型一樣,默認自動推導的實數類型是 float64,所以 complexValue2 是 complex128 類型
complexValue3 := complex(1.10, 10) // 與 complexValue2 等價
對於一個複數 z = complex(x, y)
,就可以通過 Go 語言內置函數 real(z)
獲得該複數的實部,也就是 x
,通過 imag(z)
獲得該複數的虛部,也就是 y
。
複數支持和其它數字類型一樣的算術運算符。當你使用 ==
或者 !=
對複數進行比較運算時,由於構成複數的實數部分也是浮點型,需要注意對精度的把握。
边栏推荐
- Is online stock investment exchange group safe? Is it reliable to open an account for free?
- Necessary software tools in embedded software development
- 2022安全员-C证考试题库模拟考试平台操作
- 新手开哪家的证券账户是比较好?股票开户安全吗
- Packet capturing and sorting out external Fiddler -- understanding the toolbar [1]
- 暴雨去哪儿?天气预报不准谁的锅?
- Question bank and answers of special operation certificate for R1 quick opening pressure vessel operation in 2022
- 同样是MB,差距怎么这么大呢?
- collections. Use of defaultdict()
- Apache - about Apache
猜你喜欢
根据Explain查看sql执行计划,对SQL进行优化
如何获取GC(垃圾回收器)的STW(暂停)时间?
云应用、服务的“5层”架构
R1 Quick Open Pressure Vessel Operation Special Operation Certificate Examination Library and Answers in 2022
Excel知识技能汇总
Object class, and__ new__,__ init__,__ setattr__,__ dict__
[iptables & ICMP] description of ICMP Protocol in iptables default policy
【PaddleDetection】ModuleNotFoundError: No module named ‘paddle‘
Why is the service implementation class always red
STM32外设SDIO和SD卡的配置
随机推荐
国泰君安证券靠谱吗?开证券账户安全吗?
Packet capturing and sorting out external Fiddler -- understanding the toolbar [1]
xml&nbsp;文件的读写
基于 LNMP 搭建个人网站的填坑之旅
Apache——阿帕奇簡介
Win10 如何删除系统盘大文件hiberfil.sys
crond BAD FILE MODE /etc/cron. d
SSH框架的搭建(下)
Ten reasons for system performance failure
Dataloader参数collate_fn的使用
资源管理、高可用与自动化(中)
空闲中断无法清除
matlab习题 —— 数据的基本处理
GAMES104 作业2-ColorGrading
【小程序】使用font-awesome字体图标的解决文案(图文)
2022 safety officer-c certificate examination question bank simulated examination platform operation
Severe Tire Damage:世界上第一个在互联网上直播的摇滚乐队
Apache - about Apache
自用工具 猴子都会用的unity视频播放器
Brief history and future trend of codeless software