最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang 處理浮點數(shù)遇到的精度問題(使用decimal)

 更新時間:2022年02月22日 09:30:21   作者:頭禿貓輕王  
本文主要介紹了Golang 處理浮點數(shù)遇到的精度問題,不使用decimal會出大問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、浮點數(shù)是什么?

浮點數(shù),是屬于有理數(shù)中某特定子集的數(shù)的數(shù)字表示,在計算機中用以近似表示任意某個實數(shù)。浮點數(shù)在計算機中主要用來表示小數(shù),浮點數(shù)就是小數(shù)點可以出現(xiàn)改變的數(shù)字。

因為在計算機的機器語言中,只有二進制,機器語言只能識別0和1。所以,計算機也是不可能存儲小數(shù)的,所以需要有另一種變通的存儲方案。
這種方案就是:

1.指數(shù)方案

指數(shù)形式:其數(shù)值部分是一個小數(shù),小數(shù)點前的數(shù)字是零,小數(shù)點后的第一位數(shù)字不是零。一個實數(shù)可以有多種指數(shù)表示形式,但只有一種屬于標(biāo)準(zhǔn)化指數(shù)形式。

  
12.31.23*10^-1
1.231.23*10^0
1.230.123*10^1

上面的表格,我們可以很清晰的了解指數(shù)方案。同樣的我們也就能發(fā)現(xiàn)這樣表達小數(shù)會有一個嚴(yán)重的問題,那就是指數(shù)表示形式太多了,如果不能約定好唯一形式,不同代碼之間溝通將會出現(xiàn)問題。

2.規(guī)范化指數(shù)形式

在指數(shù)形式的多種表示方式中把小數(shù)部分中小數(shù)點前的數(shù)字為0、小數(shù)點后第1位數(shù)字不為0的表示形式稱為規(guī)范化的指數(shù)形式。

1.23 的規(guī)范化的指數(shù)形式 0.123*10^1

一個實數(shù)只有一個規(guī)范化的指數(shù)形式,在程序以指數(shù)形式輸出一個實數(shù)時,必然以規(guī)范化的指數(shù)形式輸出。

0.123e001

1.為什么要以 0 開頭

1.23456要二進制存放需分別存整數(shù)部和小數(shù)部,而0.123456則只需存小數(shù)部,這樣在占用相同字節(jié)的情況下,后一種方法可容納更大精度的浮點數(shù)。

2.為什么 e 后面要加 0 ,e001 和 e1 一樣嗎

后面加 0 是 %e 的輸出格式,并不是規(guī)范化的指數(shù)形式所必需的,
e001 和 e1 是一樣的

3.IEEE 754標(biāo)準(zhǔn)

由于不同機器對浮點數(shù)的表示有較大差別,這不利于軟件在不同計算機之間的移植。為此,美國IEEE提出了一個從系統(tǒng)角度支持浮點數(shù)的表示方法,稱為IEEE754標(biāo)準(zhǔn)(IEEE,1985),當(dāng)今流行的計算機幾乎都采用了這一標(biāo)準(zhǔn)。

IEEE 754規(guī)定了四種表示浮點數(shù)值的方式:單精確度(32位)、雙精確度(64位)、延伸單精確度(43比特以上,很少使用)與延伸雙精確度(79比特以上,通常以80位實現(xiàn))。只有32位模式有強制要求,其他都是選擇性的。

二、出現(xiàn)精度問題的情況

1.浮點數(shù)加減運算

輸入數(shù)據(jù):

a = 2.3329 b = 3.1234

代碼如下(示例):

package main

import "fmt"

func main() {

	// a = 2.3329 b = 3.1234
	a, b := 2.3329, 3.1234

	c := a + b

	fmt.Println(c) //5.456300000000001}

}

結(jié)果精度出現(xiàn)問題
2.3329 + 3.1234 = 5.456300000000001
已經(jīng)出錯

2.float64與float32之間轉(zhuǎn)換

輸入數(shù)據(jù):

a = 9.99999

代碼如下(示例):

package main

import "fmt"

func main() {

	var a float32
	a = 9.99999

	b := float64(a)
	fmt.Println(b) //9.999990463256836}

}

結(jié)果精度出現(xiàn)問題
9.99999 = 9.999990463256836
已經(jīng)出錯

3.int64和float64,int32和float32轉(zhuǎn)換

1.int32和float32轉(zhuǎn)換

輸入數(shù)據(jù):

a = 9.99999

代碼如下(示例):

package main

import "fmt"

func main() {

	var a int32
	a = 999990455

	b := float32(a)
	fmt.Printf("%f\n", b) //999990464.000000}

}

結(jié)果精度出現(xiàn)問題
999990455= 999990464.000000
已經(jīng)出錯

2.int64和float64轉(zhuǎn)換

輸入數(shù)據(jù):

a = 999999942424527242

代碼如下(示例):

package main

import "fmt"

func main() {

	var a int64
	a = 999999942424527242

	b := float64(a)
	fmt.Printf("%f\n", b) //999999942424527232.000000}

}

結(jié)果精度出現(xiàn)問題
999999942424527242 = 999999942424527232.000000
已經(jīng)出錯

4.float64位直接乘100

輸入數(shù)據(jù):

a = 999999942424527242

代碼如下(示例):

package main

import "fmt"

func main() {

	var a float64
	a = 1128.61

	b := a * 100
	fmt.Println(b) //112860.99999999999}

}

結(jié)果精度出現(xiàn)問題
1128.61 * 100= 112860.99999999999
已經(jīng)出錯

三、decimal 解決精度問題

利用 Decimal 包解決精度問題

 go get github.com/shopspring/decimal

1.浮點數(shù)加減運算

輸入數(shù)據(jù):

a = 2.3329 b = 3.1234

代碼如下(示例):

package main

import (
	"fmt"
	"github.com/shopspring/decimal"
)

func main() {

	// a = 2.3329 b = 3.1234
	a, b := 2.3329, 3.1234

	c := decimal.NewFromFloat(a)
	d := decimal.NewFromFloat(b)
	fmt.Println(a, b)
	fmt.Println(c, d)
	fmt.Println("此時ab 與 cd 相同")
	
	fmt.Println(a + b)    //5.456300000000001}
	fmt.Println(c.Add(d)) //5.4563}

}

結(jié)果精度不再出現(xiàn)問題

在這里插入圖片描述

2.float64與float32之間轉(zhuǎn)換

輸入數(shù)據(jù):

a = 9.99999

代碼如下(示例):

package main

import (
	"fmt"
	"github.com/shopspring/decimal"
)

func main() {

	var a float32
	a = 9.99999
	c := decimal.NewFromFloat32(a)
	
	b := float64(a)
	c.Float64()
	fmt.Println(b) //9.999990463256836}
	fmt.Println(c.Float64()) //9.99999}

}

結(jié)果精度不再出現(xiàn)問題

在這里插入圖片描述

3.float64位直接乘100

輸入數(shù)據(jù):

a = 999999942424527242

代碼如下(示例):

package main

import (
	"fmt"
	"github.com/shopspring/decimal"
)

func main() {

	var a float64
	a = 1128.61
	c := decimal.NewFromFloat(a)

	b := a * 100
	fmt.Println(b) //112860.99999999999}
	fmt.Println(c.Mul(decimal.NewFromInt(100))) //112861}

}

結(jié)果精度不再出現(xiàn)問題

在這里插入圖片描述

總結(jié)

通過以上兩個例子,我們已經(jīng)了解了浮點數(shù)的精度問題,那么在工作中,我們就需要更換運算方式。我們需要盡量選擇Decimal,否則如果使用 Float 出現(xiàn)精度問題之后,到那時再更換方法,既費時又費力,能剛開始就解決,何樂而不為呢。

到此這篇關(guān)于Golang 處理浮點數(shù)遇到的精度問題(使用decimal)的文章就介紹到這了,更多相關(guān)Golang 浮點精度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文掌握gorm簡介及如何使用gorm

    一文掌握gorm簡介及如何使用gorm

    Gorm是一款用于Golang的ORM框架,它提供了豐富的功能,包括模型定義、數(shù)據(jù)驗證、關(guān)聯(lián)查詢等,下面通過本文掌握gorm簡介及使用方法,需要的朋友可以參考下
    2024-02-02
  • golang中包無法引入問題解決

    golang中包無法引入問題解決

    本文主要介紹了golang中包無法引入問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go語言defer的一些神奇規(guī)則示例詳解

    Go語言defer的一些神奇規(guī)則示例詳解

    這篇文章主要為大家介紹了Go語言defer的一些神奇規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 一文詳解Golang連接kafka的基本操作

    一文詳解Golang連接kafka的基本操作

    這篇文章主要為大家詳細介紹了Golang中連接kafka的基本操作的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • golang 常用定時任務(wù)匯總

    golang 常用定時任務(wù)匯總

    這篇文章主要介紹了golang 常用定時任務(wù)匯總,golang利用goroutine外加github.com/gorhill/cronexpr庫就可實現(xiàn)定時任務(wù),具體代碼介紹,需要的小伙伴可以參考一下
    2022-09-09
  • go語言中函數(shù)與方法介紹

    go語言中函數(shù)與方法介紹

    這篇文章介紹了go語言中的函數(shù)與方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 一文詳解golang中的gmp模型

    一文詳解golang中的gmp模型

    這篇文章主要介紹了golang中的gmp模型的誕生、概念及調(diào)度講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Golang?Configor配置文件工具的使用詳解

    Golang?Configor配置文件工具的使用詳解

    Configor是一個支持?yaml、json、toml、shell?的配置文件工具,這篇文中主要為大家詳細介紹了Configor的具體使用,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • golang接口的正確用法分享

    golang接口的正確用法分享

    這篇文章主要介紹了golang接口的正確用法分享的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • golang 整合antlr語法校驗解析

    golang 整合antlr語法校驗解析

    Antlr是一個語法分析器,本身是用java實現(xiàn)的,然是Runtime的庫也支持Golang、Java、Python等,本文給大家講解使用golang整合antlr進行語法解析,感興趣的朋友一起看看吧
    2023-02-02

最新評論

敦煌市| 府谷县| 高雄市| 扎鲁特旗| 桐城市| 桐庐县| 伊吾县| 普格县| 敖汉旗| 红桥区| 杂多县| 陵川县| 三门峡市| 定兴县| 淳安县| 常山县| 华容县| 北川| 建德市| 灵璧县| 陇川县| 大荔县| 类乌齐县| 长治县| 赣榆县| 彩票| 沙雅县| 东方市| 北流市| 青浦区| 玛多县| 南漳县| 南投县| 新邵县| 庄河市| 聂荣县| 英山县| 高碑店市| 舟曲县| 西峡县| 格尔木市|