当前位置:网站首页>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。
複數支持和其它數字類型一樣的算術運算符。當你使用 == 或者 != 對複數進行比較運算時,由於構成複數的實數部分也是浮點型,需要注意對精度的把握。
边栏推荐
猜你喜欢

可扩展数据库(上)

Build your own website (17)

基于流的深度生成模型

Set drop-down options on Excel files

2022安全员-C证考试题库模拟考试平台操作

R language penalty logistic regression, linear discriminant analysis LDA, generalized additive model GAM, multiple adaptive regression splines Mars, KNN, quadratic discriminant analysis QDA, decision

Dataloader parameter collate_ Use of FN

Importer un fichier Excel, résoudre le problème de sauter les cellules vides et de ne pas lire, et avancer l'indice, et retourner Blank As NULL Red

matlab习题 —— 数据的基本处理

导入Excel文件,解决跳过空白单元格不读取,并且下标前移的问题,以及RETURN_BLANK_AS_NULL报红
随机推荐
xml&nbsp;文件的读写
Packet capturing and sorting out external Fiddler -- understanding the toolbar [1]
文档问题
在牛客中使用JS编程题【split】
service实现类里面为何一直报红
No&nbsp;result&nbsp;defined&amp;nbsp…
数字化时代,企业须做好用户信息安全
爱普生L3153打印机如何清洗喷头
Why is the service implementation class always red
如何给Eclips自动添加作者,时间等…
Agileplm exception resolution session
2022 operation of simulated examination platform of special operation certificate examination question bank for safety management personnel of hazardous chemical business units
Is your IOT security strong enough?
空闲中断无法清除
剑指 Offer 49. 丑数(三指针法)
Excel知识技能汇总
2022安全员-C证考试题库模拟考试平台操作
composition api在项目中的使用总结
如何编写简洁代码?(上)
「运维有小邓」监控文件及文件夹变更