日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

在Go中使用接口:實用性與脆弱性的平衡

來源: 責編: 時間:2024-02-04 09:02:12 219觀看
導讀在開發的初始階段,我們經常會遇到“浮點數精度”和“貨幣值表示”的問題。那么,如何處理貨幣,如何存儲和傳遞它們。為什么是問題?Go語言中的標準浮點類型具有一定的精度(像其他任何語言一樣),你不能在貨幣操作中使用它們。這

在開發的初始階段,我們經常會遇到“浮點數精度”和“貨幣值表示”的問題。cDQ28資訊網——每日最新資訊28at.com

那么,如何處理貨幣,如何存儲和傳遞它們。cDQ28資訊網——每日最新資訊28at.com

為什么是問題?

Go語言中的標準浮點類型具有一定的精度(像其他任何語言一樣),你不能在貨幣操作中使用它們。這里有一個最簡單的例子:cDQ28資訊網——每日最新資訊28at.com

var v1, v2 = 0.1, 0.2fmt.Println(v1 + v2)// 輸出:0.30000000000000004

你可以計算你需要將一個值與另一個值相加多少次,才能在你的賬戶上獲得額外的錢!但反過來也是一樣 — 在這種情況下,你只是失去了你的錢。cDQ28資訊網——每日最新資訊28at.com

這不僅在對你的錢進行數學運算時有問題,而且在不同系統或服務之間傳遞數據時也是有問題的。cDQ28資訊網——每日最新資訊28at.com

下一個問題 — 傳遞你的錢

每次將你的錢從/到浮點數進行編組時,都會遇到與上述相同的問題,以及與編組器實現有關的其他問題 - json,xml,text等等...cDQ28資訊網——每日最新資訊28at.com

另一個問題是四舍五入。如果你處理的是貨幣,你總會面臨四舍五入的問題。你應該如何四舍五入你的貨幣值?例如 0.345 元,一般我們還是會四舍五入到 0.35 元?cDQ28資訊網——每日最新資訊28at.com

我們的選擇是什么?

有一些特殊的類型可用于貨幣的表示和計算。cDQ28資訊網——每日最新資訊28at.com

Go標準庫有 big.Float 類型(來自 math/big 包,表示任意精度的浮點數)。與 float32 和 float64 不同,它們具有固定的大小和精度,big.Float 允許你為數字和計算設置任意精度。cDQ28資訊網——每日最新資訊28at.com

另一個不錯的選擇是 decimal 庫 (https://github.com/shopspring/decimal)。cDQ28資訊網——每日最新資訊28at.com

關于四舍五入:cDQ28資訊網——每日最新資訊28at.com

  • 1.234 => 1.23
  • 1.235 => 1.24
  • 1.236 => 1.24

例如,shopspring/decimal 提供了適當舍入值的方法。cDQ28資訊網——每日最新資訊28at.com

考慮的另一個好選擇是使用貨幣單位。這樣,你就從浮點數問題轉移到整數,并將一切都作為整數計算。在這里唯一使用四舍五入的地方:傳遞結果值。cDQ28資訊網——每日最新資訊28at.com

現在讓我們討論一下在傳遞貨幣時的選擇。cDQ28資訊網——每日最新資訊28at.com

  • 使用貨幣單位 — 我們將所有內容都傳遞為整數,這里沒有浮點問題。只需控制值的限制,就可以了。
  • 將浮點數作為字符串傳遞。通常也是一個不錯的選擇 — 當你將浮點數作為字符串傳遞時,帶有所需精度(特定小數位數)的字符串,當對方讀取此字符串值并將其轉換回浮點數時,你就是安全的。

簡單的例子

你可以在 Go Playground 上嘗試一下。cDQ28資訊網——每日最新資訊28at.com

package mainimport (    "fmt"    "github.com/shopspring/decimal")func main() {    a := 0.1    b := 0.2    c := decimal.NewFromFloat(a)    d := decimal.NewFromFloat(b)    fmt.Println(a, b, c.String(), d.String())     fmt.Println(a + b)     fmt.Println(c.Add(d).String()) }

輸出為:cDQ28資訊網——每日最新資訊28at.com

0.1 0.2 0.1 0.20.300000000000000040.3

結論

處理貨幣時 — 使用 math/big 或一些與貨幣相關的庫,比如 shopspring/decimal,或者只是使用貨幣單位,在這里不要使用浮點數。將貨幣作為字符串傳遞,或者在貨幣單位中傳遞,不要在這里使用浮點數。cDQ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-72433-0.html在Go中使用接口:實用性與脆弱性的平衡

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 容器下在 Triton Server 中使用 TensorRT-LLM 進行推理

下一篇: Effect詳解,你學會了嗎?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 河津市| 新乡市| 黔江区| 韶关市| 平顶山市| 固安县| 老河口市| 惠东县| 兰溪市| 高邑县| 天祝| 确山县| 荔波县| 秦皇岛市| 措美县| 平定县| 湟中县| 达州市| 定安县| 水富县| 隆昌县| 利津县| 峨边| 新泰市| 鄂州市| 黎城县| 同德县| 易门县| 尼木县| 玉溪市| 淮滨县| 恩施市| 来安县| 建湖县| 磐石市| 中西区| 芦山县| 故城县| 宜章县| 北京市| 高州市|