欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

為什么是問題

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

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

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

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

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

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

另一個(gè)問題是四舍五入。如果你處理的是貨幣,你總會(huì)面臨四舍五入的問題。你應(yīng)該如何四舍五入你的貨幣值?例如 0.345 元,一般我們還是會(huì)四舍五入到 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)對(duì)方讀取此字符串值并將其轉(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è)小技巧:對(duì)于這些數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Go語言實(shí)現(xiàn)常見hash算法

    使用Go語言實(shí)現(xiàn)常見hash算法

    這篇文章主要為大家詳細(xì)介紹了使語言實(shí)現(xiàn)各種常見hash算法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考下
    2024-01-01
  • 一文帶你輕松理解Go中的內(nèi)存逃逸問題

    一文帶你輕松理解Go中的內(nèi)存逃逸問題

    這篇文章主要給大家介紹Go中的內(nèi)存逃逸問題,文中通過代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的同學(xué)可以跟著小編一起來學(xué)習(xí)
    2023-06-06
  • golang內(nèi)存對(duì)齊詳解

    golang內(nèi)存對(duì)齊詳解

    在golang中,每一種數(shù)據(jù)類型都有其對(duì)應(yīng)的數(shù)據(jù)類型大小,也就是占用了多少內(nèi)存空間,我們可以通過unsafe.Sizeof函數(shù),來確定一個(gè)變量占用的內(nèi)存字節(jié)數(shù),本文將詳細(xì)給大家介紹golang內(nèi)存對(duì)齊,需要的朋友可以參考下
    2023-10-10
  • gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼

    gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼

    Gorm是Go語言的ORM框架,提供一套對(duì)數(shù)據(jù)庫進(jìn)行增刪改查的接口,本文主要介紹了gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Go 語言的指針的學(xué)習(xí)筆記

    Go 語言的指針的學(xué)習(xí)筆記

    這篇文章主要介紹了Go 語言的指針的學(xué)習(xí)筆記,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP

    Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP

    這篇文章主要為大家介紹了Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang算法問題之整數(shù)拆分實(shí)現(xiàn)方法分析

    Golang算法問題之整數(shù)拆分實(shí)現(xiàn)方法分析

    這篇文章主要介紹了Golang算法問題之整數(shù)拆分實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Go語言數(shù)值運(yùn)算與數(shù)組遍歷相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • 分析Go語言接口的設(shè)計(jì)原則

    分析Go語言接口的設(shè)計(jì)原則

    interface是Go語言的基礎(chǔ)特性之一, 可以理解為對(duì)一種類型的規(guī)范或者約束。他跟java、c++不同, Go語言實(shí)現(xiàn)接口不需要顯示說明實(shí)現(xiàn)了哪個(gè)接口, 也沒有繼承或者子類或者implement關(guān)鍵字。只是通過約定的形式, 隱式的實(shí)現(xiàn)接口中的方法即可
    2021-06-06
  • Go語言什么時(shí)候該使用指針

    Go語言什么時(shí)候該使用指針

    本文主要介紹了Go語言什么情況下應(yīng)該使用指針,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解golang開發(fā)中select多路選擇

    詳解golang開發(fā)中select多路選擇

    這篇文章主要介紹了golang開發(fā)中select多路選擇,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論