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

go語(yǔ)言中decimal的用法詳解

 更新時(shí)間:2023年03月07日 15:47:59   作者:心的步伐  
本文主要介紹了go語(yǔ)言中decimal的用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

decimal是為了解決Golang中浮點(diǎn)數(shù)計(jì)算時(shí)精度丟失問(wèn)題而生的一個(gè)庫(kù),使用decimal庫(kù)我們可以避免在go中使用浮點(diǎn)數(shù)出現(xiàn)精度丟失的問(wèn)題。

github地址:https://github.com/shopspring/decimal

1. 精度丟失的case

func TestFloat(t *testing.T) {
    a := 1100.1
    b := a * 100
    fmt.Println(b) // should be: 110010 output: 110009.99999999999
}

上面的精度就發(fā)生了丟失,浮點(diǎn)數(shù)的位數(shù)雖然我們看到的是1100.1,但對(duì)于浮點(diǎn)數(shù)的計(jì)算而言卻是無(wú)限接近于1,但與1不等。

當(dāng)我們需要對(duì)float的數(shù)據(jù)進(jìn)行計(jì)算的時(shí)候,我們可以使用第三方的decimal包來(lái)解決這個(gè)問(wèn)題。

2. decimal的應(yīng)用場(chǎng)景

decimal的應(yīng)用場(chǎng)景主要出現(xiàn)在對(duì)float浮點(diǎn)數(shù)進(jìn)行加減乘除操作的時(shí)候,尤其是對(duì)于銀行金融一塊的業(yè)務(wù),如果精度丟失,一筆交易上面的損失可以忽略不計(jì),但當(dāng)交易的規(guī)模達(dá)到幾千萬(wàn)或者億甚至幾十億的時(shí)候,這個(gè)時(shí)候的損失就會(huì)大的嚇人了。

3. 使用decimal

使用decimal第一步是引入這個(gè)包,decimal,在官方的描述中,這個(gè)包的功能描述如下:

Arbitrary-precision fixed-point decimal numbers in go.

Note: Decimal library can “only” represent numbers with a maximum of 2^31 digits after the decimal point.

go中任意精度定點(diǎn)的十進(jìn)制數(shù)

注意:十進(jìn)制庫(kù)"只能"表示小數(shù)點(diǎn)后最多2^31位的數(shù)字。

小數(shù)點(diǎn)后2^31位數(shù)字,對(duì)于絕大多數(shù)的項(xiàng)目精度要求是足夠的,簡(jiǎn)而言之,decimal可以解決我們絕大多數(shù)的浮點(diǎn)數(shù)精度計(jì)算場(chǎng)景。

對(duì)于上面精度丟失的case,當(dāng)我們引入decimal包之后,我們可以得到正確的結(jié)果。

func TestDecimalOne(t *testing.T){
    a := 1100.1
    b := 100
    d := decimal.NewFromFloat(a)
    result := d.Mul(decimal.NewFromInt(int64(b)))
    fmt.Println(result) // should be: 110010, output: 110010
}

計(jì)算結(jié)果的精度沒(méi)有丟失,計(jì)算結(jié)果正確。

4. decimal其他實(shí)用的場(chǎng)景

使用decimal的時(shí)候,切記浮點(diǎn)數(shù)計(jì)算所有數(shù)據(jù)的初始化必須通過(guò)decimal進(jìn)行,否則還是會(huì)導(dǎo)致精度的丟失,為什么這么說(shuō)呢,看看下面的例子你就明白了。

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

func TestDecimal(t *testing.T) {
?? ?x := 0.28
?? ?// this will cause the multi result has error
?? ?// output should be 28, but actually 28.000000000000004(error)
?? ?errorMul := decimal.NewFromFloat(x * 100).String()
}

上面的case就是因?yàn)?00沒(méi)有使用decimal進(jìn)行初始化導(dǎo)致最后計(jì)算的精度被擴(kuò)大了。正確的處理方式如下:

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

func TestDecimal(t *testing.T) {
?? ?x := 0.28
?? ?// the correct operate number multi is use the decimal Mul method.
?? ?correctMul := decimal.NewFromFloat(x).Mul(decimal.NewFromInt(100)).String()
? ? fmt.Println(correctMul) // output: 28
}

4.1 獲取結(jié)果的整數(shù)部分

使用IntPart可以獲取到浮點(diǎn)數(shù)計(jì)算結(jié)果的整數(shù)部分。

func TestDecimalTwo(t *testing.T){
    a := 0.01234
    b := 100
    // 0.01234 * 100 = 1.234, int part=1, output=1
    fmt.Println(decimal.NewFromFloat(a).Mul(decimal.NewFromInt(int64(b))).IntPart())
}

4.2 小數(shù)點(diǎn)后填充

使用IntPart可以對(duì)計(jì)算后的數(shù)據(jù)進(jìn)行小數(shù)點(diǎn)位數(shù)的補(bǔ)零填充。

func TestDecimalThree(t *testing.T){
    a := 0.012
    b := 100
    x := decimal.NewFromFloat(a).Mul(decimal.NewFromInt(int64(b)))
    // 小數(shù)點(diǎn)后的位數(shù)填充, 0.012*100=1.2, 填充3位,因?yàn)橐呀?jīng)有一位了,填充兩個(gè)0, 1.200
    fmt.Println(x.StringFixed(3))
}

4.3 比較數(shù)字的大小

浮點(diǎn)數(shù)的比較decimal提供了一些比較有用的函數(shù)方法,這里列舉了一部分。

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

func TestDecimalFour(t *testing.T) {
?? ?a := decimal.NewFromFloat(-1.11)
?? ?b := decimal.NewFromInt(3)
?? ?c, _ := decimal.NewFromString("2.023")
?? ?// 是否是負(fù)數(shù)
?? ?fmt.Println(a.IsNegative())
?? ?// 取絕對(duì)值
?? ?fmt.Println(a.Abs())
?? ?// 比較是否相等
?? ?fmt.Println(a.Equal(b))
?? ?// 比較小于
?? ?fmt.Println(a.LessThan(b))
?? ?// 比較小于等于
?? ?fmt.Println(a.LessThanOrEqual(b))
?? ?// 比較大于等于
?? ?fmt.Println(b.GreaterThanOrEqual(a))
?? ?// 是否是0
?? ?fmt.Println(c.IsZero())
}

5 小結(jié)

decimal對(duì)于浮點(diǎn)數(shù)的計(jì)算提供了極大的便利性,讓我們?cè)谑褂酶↑c(diǎn)數(shù)進(jìn)行大小計(jì)算的時(shí)候不用擔(dān)心精度丟失的問(wèn)題,尤其是對(duì)于金融行業(yè),精度丟失造成資損就是很重大的生產(chǎn)事故了。

對(duì)decimal有一些基本的了解,當(dāng)我們?cè)诠ぷ髦杏袌?chǎng)景需要使用到浮點(diǎn)數(shù)的計(jì)算的時(shí)候,可以直接使用decimal來(lái)幫助我們快速完善計(jì)算的邏輯。

到此這篇關(guān)于go語(yǔ)言中decimal的用法詳解的文章就介紹到這了,更多相關(guān)go語(yǔ)言decimal用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang占位符%v、%+v、%#v舉例詳解

    golang占位符%v、%+v、%#v舉例詳解

    這篇文章主要給大家介紹了關(guān)于golang占位符%v、%+v、%#v的相關(guān)資料,Go語(yǔ)言中的占位符通常用于格式化輸出,它們以%開頭,后跟一個(gè)字符,表示要轉(zhuǎn)換的數(shù)據(jù)類型,需要的朋友可以參考下
    2024-05-05
  • Go語(yǔ)言設(shè)置JSON的默認(rèn)值操作

    Go語(yǔ)言設(shè)置JSON的默認(rèn)值操作

    這篇文章主要介紹了Go語(yǔ)言設(shè)置JSON的默認(rèn)值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang中的net/rpc包使用概述(小結(jié))

    golang中的net/rpc包使用概述(小結(jié))

    本篇文章主要介紹了golang中的net/rpc包使用概述(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • VS Code配置Go語(yǔ)言開發(fā)環(huán)境的詳細(xì)教程

    VS Code配置Go語(yǔ)言開發(fā)環(huán)境的詳細(xì)教程

    這篇文章主要介紹了VS Code配置Go語(yǔ)言開發(fā)環(huán)境的詳細(xì)教程,本文通過(guò)實(shí)例代碼圖文相結(jié)合的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Go語(yǔ)言協(xié)程處理數(shù)據(jù)有哪些問(wèn)題

    Go語(yǔ)言協(xié)程處理數(shù)據(jù)有哪些問(wèn)題

    協(xié)程(coroutine)是Go語(yǔ)言中的輕量級(jí)線程實(shí)現(xiàn),由Go運(yùn)行時(shí)(runtime)管理。本文為大家詳細(xì)介紹了Go中的協(xié)程,協(xié)程不需要搶占式調(diào)度,可以有效提高線程的任務(wù)并發(fā)性,而避免多線程的缺點(diǎn)
    2023-02-02
  • Golang Map簡(jiǎn)介以及底層原理

    Golang Map簡(jiǎn)介以及底層原理

    這篇文章主要介紹了Golang Map簡(jiǎn)介以及底層原理的相關(guān)資料,Go語(yǔ)言提供的map是一種鍵值對(duì)存儲(chǔ)結(jié)構(gòu),支持基本操作如len、delete等,map是非線程安全的,可用sync.Mutex確保并發(fā)安全,為高效查找和插入,需要的朋友可以參考下
    2024-10-10
  • GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對(duì)象校驗(yàn)結(jié)構(gòu)體

    GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對(duì)象校驗(yàn)結(jié)構(gòu)體

    這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗(yàn)之校驗(yàn)對(duì)象校驗(yàn)結(jié)構(gòu)體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go-zero 應(yīng)對(duì)海量定時(shí)/延遲任務(wù)的技巧

    go-zero 應(yīng)對(duì)海量定時(shí)/延遲任務(wù)的技巧

    這篇文章主要介紹了go-zero 如何應(yīng)對(duì)海量定時(shí)/延遲任務(wù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Go語(yǔ)言并發(fā)模型的2種編程方案

    Go語(yǔ)言并發(fā)模型的2種編程方案

    這篇文章主要介紹了Go語(yǔ)言并發(fā)模型的2種編程方案,本文給出共享內(nèi)存和通過(guò)通信的2種解決方案,并給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • Go語(yǔ)言上下文context底層原理

    Go語(yǔ)言上下文context底層原理

    這篇文章主要介紹了Go語(yǔ)言上下文context底層原理,context是Go中用來(lái)進(jìn)程通信的一種方式,其底層是借助channl與snyc.Mutex實(shí)現(xiàn)的,更多相關(guān)內(nèi)容需要的小伙伴可以參加一下
    2022-06-06

最新評(píng)論

台安县| 汽车| 疏附县| 安庆市| 赫章县| 宁明县| 县级市| 买车| 资中县| 荥经县| 红安县| 舟山市| 虹口区| 浑源县| 永德县| 枣阳市| 阳原县| 绥江县| 太仆寺旗| 玛沁县| 大悟县| 巴林左旗| 石阡县| 锡林郭勒盟| 大安市| 稻城县| 顺平县| 昌乐县| 巴马| 青浦区| 开平市| 中阳县| 遂川县| 安康市| 潜山县| 内乡县| 中卫市| 乌兰浩特市| 麻江县| 南宫市| 峡江县|