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

go貨幣計(jì)算時(shí)如何避免浮點(diǎn)數(shù)精度問題

 更新時(shí)間:2024年02月04日 16:45:10   作者:愛發(fā)白日夢的后端  
在開發(fā)的初始階段,我們經(jīng)常會遇到“浮點(diǎn)數(shù)精度”和“貨幣值表示”的問題,那么在golang中如何避免這一方面的問題呢,下面就跟隨小編一起來學(xué)習(xí)一下吧

在開發(fā)的初始階段,我們經(jīng)常會遇到“浮點(diǎn)數(shù)精度”和“貨幣值表示”的問題。

那么,如何處理貨幣,如何存儲和傳遞它們。

為什么是問題

Go語言中的標(biāo)準(zhǔn)浮點(diǎn)類型具有一定的精度(像其他任何語言一樣),你不能在貨幣操作中使用它們。這里有一個(gè)最簡單的例子:

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

你可以計(jì)算你需要將一個(gè)值與另一個(gè)值相加多少次,才能在你的賬戶上獲得額外的錢!但反過來也是一樣 — 在這種情況下,你只是失去了你的錢。

這不僅在對你的錢進(jìn)行數(shù)學(xué)運(yùn)算時(shí)有問題,而且在不同系統(tǒng)或服務(wù)之間傳遞數(shù)據(jù)時(shí)也是有問題的。

下一個(gè)問題 — 傳遞你的錢

每次將你的錢從/到浮點(diǎn)數(shù)進(jìn)行編組時(shí),都會遇到與上述相同的問題,以及與編組器實(shí)現(xiàn)有關(guān)的其他問題 - json,xml,text等等...

另一個(gè)問題是四舍五入。如果你處理的是貨幣,你總會面臨四舍五入的問題。你應(yīng)該如何四舍五入你的貨幣值?例如 0.345 元,一般我們還是會四舍五入到 0.35 元?

我們的選擇是什么

有一些特殊的類型可用于貨幣的表示和計(jì)算。

Go標(biāo)準(zhǔn)庫有 big.Float 類型(來自 math/big 包,表示任意精度的浮點(diǎn)數(shù))。與 float32float64 不同,它們具有固定的大小和精度,big.Float 允許你為數(shù)字和計(jì)算設(shè)置任意精度。

另一個(gè)不錯(cuò)的選擇是 decimalgithub.com/shopspring/decimal

關(guān)于四舍五入:

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

例如,shopspring/decimal 提供了適當(dāng)舍入值的方法。

考慮的另一個(gè)好選擇是使用貨幣單位。這樣,你就從浮點(diǎn)數(shù)問題轉(zhuǎn)移到整數(shù),并將一切都作為整數(shù)計(jì)算。在這里唯一使用四舍五入的地方:傳遞結(jié)果值。

現(xiàn)在讓我們討論一下在傳遞貨幣時(shí)的選擇。

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

簡單的例子

你可以在 Go Playground 上嘗試一下。

package main

import (
    "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()) 
}

輸出為:

0.1 0.2 0.1 0.2
0.30000000000000004
0.3

結(jié)論

處理貨幣時(shí) — 使用 math/big 或一些與貨幣相關(guān)的庫,比如 shopspring/decimal,或者只是使用貨幣單位,在這里不要使用浮點(diǎn)數(shù)。將貨幣作為字符串傳遞,或者在貨幣單位中傳遞,不要在這里使用浮點(diǎn)數(shù)。

其實(shí)還有一個(gè)小技巧:對于這些數(shù)值,我們可以使用:xxx * 10000 的方式,這樣我們就可以保留其精度。10000 這個(gè)值可以在團(tuán)隊(duì)內(nèi)協(xié)商。

到此這篇關(guān)于go貨幣計(jì)算時(shí)如何避免浮點(diǎn)數(shù)精度問題的文章就介紹到這了,更多相關(guān)go浮點(diǎn)數(shù)精度問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go??Zerolog使用入門教程

    Go??Zerolog使用入門教程

    Zerolog是一個(gè)高性能的Go日志庫,通過零分配設(shè)計(jì)和結(jié)構(gòu)化輸出JSON格式,適用于高并發(fā)場景,它支持日志級別、采樣、Context、Hook機(jī)制和同時(shí)輸出控制臺和日志文件等功能,本文介紹Go Zerolog使用入門教程,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • Golang中的參數(shù)傳遞示例詳解

    Golang中的參數(shù)傳遞示例詳解

    參數(shù)傳遞是指在程序的傳遞過程中,實(shí)際參數(shù)就會將參數(shù)值傳遞給相應(yīng)的形式參數(shù),然后在函數(shù)中實(shí)現(xiàn)對數(shù)據(jù)處理和返回的過程,下面這篇文章主要給大家介紹了關(guān)于Golang中參數(shù)傳遞的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Go語言實(shí)現(xiàn)請求超時(shí)處理的方法總結(jié)

    Go語言實(shí)現(xiàn)請求超時(shí)處理的方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Go語言中實(shí)現(xiàn)請求的超時(shí)控制的方法,主要是通過timer和timerCtx來實(shí)現(xiàn)請求的超時(shí)控制,希望對大家有所幫助
    2023-05-05
  • 解析Go的Waitgroup和鎖的問題

    解析Go的Waitgroup和鎖的問題

    大家在學(xué)習(xí)go語言的時(shí)候,都知道go語言支持并發(fā),使用 goroutine,使用關(guān)鍵字 go 即可,接下來通過本文給大家分享Go的Waitgroup和鎖的問題,需要的朋友可以參考下
    2021-05-05
  • 基于go-cqhttp與Flask搭建定制機(jī)器人項(xiàng)目實(shí)戰(zhàn)示例

    基于go-cqhttp與Flask搭建定制機(jī)器人項(xiàng)目實(shí)戰(zhàn)示例

    這篇文章主要為大家介紹了基于go-cqhttp與Flask搭建定制機(jī)器人項(xiàng)目實(shí)戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Go結(jié)合MQTT實(shí)現(xiàn)通信的示例代碼

    Go結(jié)合MQTT實(shí)現(xiàn)通信的示例代碼

    本文主要介紹了Go結(jié)合MQTT實(shí)現(xiàn)通信的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 一文詳解Golang協(xié)程調(diào)度器scheduler

    一文詳解Golang協(xié)程調(diào)度器scheduler

    這篇文章主要介紹了一文詳解Golang協(xié)程調(diào)度器scheduler,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Go使用Weighted實(shí)現(xiàn)資源管理

    Go使用Weighted實(shí)現(xiàn)資源管理

    這篇文章主要介紹了Go?語言中的?Weighted?并發(fā)原語,包括?Weighted?的基本使用方法、實(shí)現(xiàn)原理、使用注意事項(xiàng)等內(nèi)容,感興趣的小伙伴可以了解一下
    2023-06-06
  • golang json性能分析詳解

    golang json性能分析詳解

    json格式可以算我們?nèi)粘W畛S玫男蛄谢袷街涣?,Go語言作為一個(gè)由Google開發(fā),號稱互聯(lián)網(wǎng)的C語言的語言,自然也對JSON格式支持很好。下面這篇文章主要給大家詳細(xì)分析介紹了golang json性能的相關(guān)資料,需要的朋友可以參考下。
    2018-02-02
  • Go語言中的range用法實(shí)例分析

    Go語言中的range用法實(shí)例分析

    這篇文章主要介紹了Go語言中的range用法,實(shí)例分析了range的功能與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評論

张家界市| 丹寨县| 石台县| 礼泉县| 吉安县| 定襄县| 寻甸| 海晏县| 太保市| 商洛市| 绥滨县| 肥城市| 琼中| 湘乡市| 安远县| 崇阳县| 时尚| 东明县| 比如县| 昭苏县| 乌拉特前旗| 鹿邑县| 库尔勒市| 舒城县| 普洱| 光山县| 肇东市| 六盘水市| 招远市| 秀山| 鹤壁市| 福安市| 镇坪县| 闽侯县| 清涧县| 肥城市| 张掖市| 垦利县| 开远市| 舒城县| 海门市|