中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang處理浮點數遇到的精度問題怎么解決

發布時間:2022-02-22 10:57:20 來源:億速云 閱讀:837 作者:iii 欄目:開發技術

這篇文章主要介紹“Golang處理浮點數遇到的精度問題怎么解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Golang處理浮點數遇到的精度問題怎么解決”文章能幫助大家解決問題。

一、浮點數是什么?

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

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

1.指數方案

指數形式:其數值部分是一個小數,小數點前的數字是零,小數點后的第一位數字不是零。一個實數可以有多種指數表示形式,但只有一種屬于標準化指數形式。

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

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

2.規范化指數形式

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

1.23 的規范化的指數形式 0.123*10^1

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

0.123e001

1.為什么要以 0 開頭

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

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

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

3.IEEE 754標準

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

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

二、出現精度問題的情況

1.浮點數加減運算

輸入數據:

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}

}

結果精度出現問題
2.3329 + 3.1234 = 5.456300000000001
已經出錯

2.float64與float32之間轉換

輸入數據:

a = 9.99999

代碼如下(示例):

package main

import "fmt"

func main() {

	var a float32
	a = 9.99999

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

}

結果精度出現問題
9.99999 = 9.999990463256836
已經出錯

3.int64和float64,int32和float32轉換

1.int32和float32轉換

輸入數據:

a = 9.99999

代碼如下(示例):

package main

import "fmt"

func main() {

	var a int32
	a = 999990455

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

}

結果精度出現問題
999990455= 999990464.000000
已經出錯

2.int64和float64轉換

輸入數據:

a = 999999942424527242

代碼如下(示例):

package main

import "fmt"

func main() {

	var a int64
	a = 999999942424527242

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

}

結果精度出現問題
999999942424527242 = 999999942424527232.000000
已經出錯

4.float64位直接乘100

輸入數據:

a = 999999942424527242

代碼如下(示例):

package main

import "fmt"

func main() {

	var a float64
	a = 1128.61

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

}

結果精度出現問題
1128.61 * 100= 112860.99999999999
已經出錯

三、decimal 解決精度問題

利用 Decimal 包解決精度問題

 go get github.com/shopspring/decimal

1.浮點數加減運算

輸入數據:

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}

}

結果精度不再出現問題

Golang處理浮點數遇到的精度問題怎么解決

2.float64與float32之間轉換

輸入數據:

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}

}

結果精度不再出現問題

Golang處理浮點數遇到的精度問題怎么解決

3.float64位直接乘100

輸入數據:

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}

}

結果精度不再出現問題

Golang處理浮點數遇到的精度問題怎么解決

關于“Golang處理浮點數遇到的精度問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永济市| 余江县| 阿拉善左旗| 会宁县| 田东县| 淳化县| 邹平县| 四川省| 额尔古纳市| 略阳县| 怀远县| 留坝县| 香河县| 恩平市| 黄陵县| 长治市| 靖安县| 鹤峰县| 兴义市| 永登县| 门头沟区| 宝坻区| 丽水市| 双峰县| 江北区| 从化市| 南康市| 开原市| 乐东| 灵川县| 周宁县| 霍州市| 佛冈县| 丹东市| 名山县| 奉节县| 涿州市| 拉孜县| 罗田县| 淳化县| 读书|