go語(yǔ)言小數(shù) go語(yǔ)言值類(lèi)型

go使用decimal

在公司項(xiàng)目中看到關(guān)于錢(qián)的數(shù)據(jù)在接口展示、添加修改的各種情況下結(jié)構(gòu)體中相應(yīng)字段用的都是string類(lèi)型。覺(jué)得不太合理,因此查閱了一些資料,整理如下。

在嶗山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,嶗山網(wǎng)站建設(shè)費(fèi)用合理。

在網(wǎng)上搜到一篇博客:

在程序計(jì)算中涉及到錢(qián)的時(shí)候,為什么要用Decimal而不是Float

博客中介紹,如果用float類(lèi)型再轉(zhuǎn)為decimal類(lèi)型時(shí)會(huì)造成精度丟失。轉(zhuǎn)為string后再轉(zhuǎn)為decimal則可以解決問(wèn)題,保證精度。看著好像是很完美的回答了我想要了解的問(wèn)題,但仔細(xì)一看用的語(yǔ)言是python,于是我便親自試了下:

結(jié)果確實(shí)如此,但看版本是2.7,我懷疑是不是python2.7版本落后,因此存在問(wèn)題,于是又換了python3,再次測(cè)試:

結(jié)論依然是一樣。好吧,證實(shí)了,對(duì)于python確實(shí)應(yīng)該先轉(zhuǎn)為string再轉(zhuǎn)為decimal。

但是,python是這樣,難道go也是這樣嗎,于是我又開(kāi)始了進(jìn)一步測(cè)試:

go中decimal使用第三方庫(kù)

這里是直接用float64轉(zhuǎn)為decimal,并沒(méi)有通過(guò)string中轉(zhuǎn),結(jié)果輸出如下:

乍一看,看著好像是精度丟失了似的,但是對(duì)比后我們發(fā)現(xiàn),float64和decimal前后都是一致的,也就是說(shuō)float64轉(zhuǎn)為decimal之后,保持了原樣。那些看起來(lái)小數(shù)點(diǎn)后位數(shù)很多的結(jié)果,是因?yàn)閒loat64浮點(diǎn)類(lèi)型計(jì)算產(chǎn)生的問(wèn)題,跟轉(zhuǎn)換并沒(méi)有關(guān)系。

為了驗(yàn)證這一結(jié)論,我又寫(xiě)了下面的測(cè)試:

不使用浮點(diǎn)類(lèi)型相加,而用decimal類(lèi)型相加,這樣輸出結(jié)果果然沒(méi)問(wèn)題了:

因此我們可以得出結(jié)論:對(duì)于go語(yǔ)言,在把float轉(zhuǎn)換為decimal類(lèi)型時(shí),并不需要像python一樣通過(guò)string中轉(zhuǎn),也依然可以保持精度。進(jìn)一步,我們也可以想到上面的問(wèn)題,對(duì)于錢(qián),在結(jié)構(gòu)體字段中,我們完全可以直接使用float類(lèi)型,并不需要用string類(lèi)型。而且好處時(shí),使用float數(shù)值類(lèi)型,無(wú)論對(duì)于前端還是后端,在進(jìn)行數(shù)值范圍驗(yàn)證的時(shí)候,會(huì)更方便,不必把string轉(zhuǎn)為float后再驗(yàn)證了。

上面提到了decimal包,我們這里簡(jiǎn)單看下,里面的常用的方法:

定義decimal的幾種方式:

decimal數(shù)值運(yùn)算

比較:

我們?cè)倏聪赂↑c(diǎn)精度運(yùn)算不準(zhǔn)確的原因,這篇文章講解的比較細(xì)

浮點(diǎn)精度(float、double)運(yùn)算不精確的原因

精度運(yùn)算不準(zhǔn)確這是為什么呢?我們接下來(lái)就需要從計(jì)算機(jī)所有數(shù)據(jù)的表現(xiàn)形式二進(jìn)制說(shuō)起了。如果大家很了解二進(jìn)制與十進(jìn)制的相互轉(zhuǎn)換,那么就能輕易的知道精度運(yùn)算不準(zhǔn)確的問(wèn)題原因是什么了。

接下來(lái)我們看一個(gè)簡(jiǎn)單的例子 2.1 這個(gè)十進(jìn)制數(shù)轉(zhuǎn)成二進(jìn)制是什么樣子的。

落入無(wú)限循環(huán)結(jié)果為 10.0001100110011........ , 我們的計(jì)算機(jī)在存儲(chǔ)小數(shù)時(shí)肯定是有長(zhǎng)度限制的,所以會(huì)進(jìn)行截取部分小數(shù)進(jìn)行存儲(chǔ),從而導(dǎo)致計(jì)算機(jī)存儲(chǔ)的數(shù)值只能是個(gè)大概的值,而不是精確的值。從這里看出來(lái)我們的計(jì)算機(jī)根本就無(wú)法使用二進(jìn)制來(lái)精確的表示 2.1 這個(gè)十進(jìn)制數(shù)字的值,連表示都無(wú)法精確表示出來(lái),計(jì)算肯定是會(huì)出現(xiàn)問(wèn)題的。

1、為什么數(shù)值表示用decimal 不用double

2、在程序計(jì)算中涉及到錢(qián)的時(shí)候,為什么要用Decimal而不是Float

3、MySQL數(shù)據(jù)類(lèi)型DECIMAL用法

4、浮點(diǎn)精度(float、double)運(yùn)算不精確的原因

原生支持decimal類(lèi)型的語(yǔ)言

Go語(yǔ)言。在Python中,符合原生且可以支持decimal類(lèi)型的語(yǔ)言是Go語(yǔ)言。decimal是指帶固定精度和小數(shù)位數(shù)的數(shù)值數(shù)據(jù)類(lèi)型,數(shù)據(jù)就是數(shù)值,數(shù)據(jù)有很多種,最簡(jiǎn)單的就是數(shù)字。

go語(yǔ)言中%.2f是什么意思?

go語(yǔ)言中%.2f是一個(gè)格式化輸出符號(hào),表示輸出一個(gè)浮點(diǎn)數(shù),保留兩位小數(shù)。例如,如果x是一個(gè)浮點(diǎn)數(shù),那么fmt.Printf(“%.2f”, x)就會(huì)輸出x的值,只保留兩位小數(shù)。

Go語(yǔ)言的%d,%p,%v等占位符的使用

這些是死知識(shí),把常用的記住,不常用的直接查表就行了

golang 的fmt 包實(shí)現(xiàn)了格式化I/O函數(shù),類(lèi)似于C的 printf 和 scanf。

type Human struct {

Name string

}

var people = Human{Name:"zhangsan"}

golang沒(méi)有 '%u' 點(diǎn)位符,若整數(shù)為無(wú)符號(hào)類(lèi)型,默認(rèn)就會(huì)被打印成無(wú)符號(hào)的。

寬度與精度的控制格式以Unicode碼點(diǎn)為單位。寬度為該數(shù)值占用區(qū)域的最小寬度;精度為小數(shù)點(diǎn)之后的位數(shù)。

操作數(shù)的類(lèi)型為int時(shí),寬度與精度都可用字符 '*' 表示。

對(duì)于 %g/%G 而言,精度為所有數(shù)字的總數(shù),例如:123.45,%.4g 會(huì)打印123.5,(而 %6.2f 會(huì)打印123.45)。

%e 和 %f 的默認(rèn)精度為6

對(duì)大多數(shù)的數(shù)值類(lèi)型而言,寬度為輸出的最小字符數(shù),如果必要的話會(huì)為已格式化的形式填充空格。

而以字符串類(lèi)型,精度為輸出的最大字符數(shù),如果必要的話會(huì)直接截?cái)唷?/p>

使用起來(lái)很簡(jiǎn)單,一般配合fmt.Printf()使用,因?yàn)閒mt的Printf()是有格式的輸出,切忌使用Println(),否則將會(huì)以字符串的形式輸出。

查看原文: golang fmt格式“占位符”

分享文章:go語(yǔ)言小數(shù) go語(yǔ)言值類(lèi)型
本文來(lái)源:http://muchs.cn/article4/ddiijie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司小程序開(kāi)發(fā)、網(wǎng)站策劃、移動(dòng)網(wǎng)站建設(shè)、App設(shè)計(jì)、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站