用go語言寫數(shù)字 go語言簡明教程

go使用decimal

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

創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),小程序開發(fā),十載建站對成都石涼亭等多個行業(yè),擁有豐富建站經(jīng)驗。

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

在程序計算中涉及到錢的時候,為什么要用Decimal而不是Float

博客中介紹,如果用float類型再轉(zhuǎn)為decimal類型時會造成精度丟失。轉(zhuǎn)為string后再轉(zhuǎn)為decimal則可以解決問題,保證精度??粗孟袷呛芡昝赖幕卮鹆宋蚁胍私獾膯栴},但仔細(xì)一看用的語言是python,于是我便親自試了下:

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

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

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

go中decimal使用第三方庫

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

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

為了驗證這一結(jié)論,我又寫了下面的測試:

不使用浮點類型相加,而用decimal類型相加,這樣輸出結(jié)果果然沒問題了:

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

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

定義decimal的幾種方式:

decimal數(shù)值運算

比較:

我們再看下浮點精度運算不準(zhǔn)確的原因,這篇文章講解的比較細(xì)

浮點精度(float、double)運算不精確的原因

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

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

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

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

2、在程序計算中涉及到錢的時候,為什么要用Decimal而不是Float

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

4、浮點精度(float、double)運算不精確的原因

Go語言和其他語言的不同之基本語法

Go語言作為出現(xiàn)比較晚的一門編程語言,在其原生支持高并發(fā)、云原生等領(lǐng)域的優(yōu)秀表現(xiàn),像目前比較流行的容器編排技術(shù)Kubernetes、容器技術(shù)Docker都是用Go語言寫的,像Java等其他面向?qū)ο蟮恼Z言,雖然也能做云原生相關(guān)的開發(fā),但是支持的程度遠(yuǎn)沒有Go語言高,憑借其語言特性和簡單的編程方式,彌補了其他編程語言一定程度上的不足,一度成為一個熱門的編程語言。

最近在學(xué)習(xí)Go語言,我之前使用過C#、Java等面向?qū)ο缶幊痰恼Z言,發(fā)現(xiàn)其中有很多的編程方式和其他語言有區(qū)別的地方,好記性不如爛筆頭,總結(jié)一下,和其他語言做個對比。這里只總結(jié)差異的地方,具體的語法不做詳細(xì)的介紹。

種一棵樹最好的時間是十年前,其次是現(xiàn)在。

3)變量初始化時候可以和其他語言一樣直接在變量后面加等號,等號后面為要初始化的值,也可以使用變量名:=變量值的簡單方式

3)變量賦值 Go語言的變量賦值和多數(shù)語言一致,但是Go語言提供了多重賦值的功能,比如下面這個交換i、j變量的語句:

在不支持多重賦值的語言中,交換兩個變量的值需要引入一個中間變量:

4)匿名變量

在使用其他語言時,有時候要獲取一個值,卻因為該函數(shù)返回多個值而不得不定義很多沒有的變量,Go語言可以借助多重返回值和匿名變量來避免這種寫法,使代碼看起來更優(yōu)雅。

假如GetName()函數(shù)返回3個值,分別是firstName,lastName和nickName

若指向獲得nickName,則函數(shù)調(diào)用可以這樣寫

這種寫法可以讓代碼更清晰,從而大幅降低溝通的復(fù)雜度和維護(hù)的難度。

1)基本常量

常量使用關(guān)鍵字const 定義,可以限定常量類型,但不是必須的,如果沒有定義常量的類型,是無類型常量

2)預(yù)定義常量

Go語言預(yù)定義了這些常量 true、false和iota

iota比較特殊,可以被任務(wù)是一個可被編譯器修改的常量,在每個const關(guān)鍵字出現(xiàn)時被重置為0,然后在下一個const出現(xiàn)之前每出現(xiàn)一個iota,其所代表的數(shù)字會自動加1.

3)枚舉

1)int 和int32在Go語言中被認(rèn)為是兩種不同類型的類型

2)Go語言定義了兩個浮點型float32和float64,其中前者等價于C語言的float類型,后者等價于C語言的double類型

3)go語言支持復(fù)數(shù)類型

復(fù)數(shù)實際上是由兩個實數(shù)(在計算機中使用浮點數(shù)表示)構(gòu)成,一個表示實部(real)、一個表示虛部(imag)。也就是數(shù)學(xué)上的那個復(fù)數(shù)

復(fù)數(shù)的表示

實部與虛部

對于一個復(fù)數(shù)z=complex(x,y),就可以通過Go語言內(nèi)置函數(shù)real(z)獲得該復(fù)數(shù)的實部,也就是x,通過imag(z)獲得該復(fù)數(shù)的虛部,也就是y

4)數(shù)組(值類型,長度在定義后無法再次修改,每次傳遞都將產(chǎn)生一個副本。)

5)數(shù)組切片(slice)

數(shù)組切片(slice)彌補了數(shù)組的不足,其數(shù)據(jù)結(jié)構(gòu)可以抽象為以下三個變量:

6)Map 在go語言中Map不需要引入任何庫,使用很方便

Go循環(huán)語句只支持for關(guān)鍵字,不支持while和do-while

goto語句的語義非常簡單,就是跳轉(zhuǎn)到本函數(shù)內(nèi)的某個標(biāo)簽

今天就介紹到這里,以后我會在總結(jié)Go語言在其他方面比如并發(fā)編程、面向?qū)ο?、網(wǎng)絡(luò)編程等方面的不同及使用方法。希望對大家有所幫助。

GO GOLANG 生成范圍隨機數(shù)

math/rand 中的所有整數(shù)函數(shù)都生成非負(fù)數(shù).

示例 main.go

執(zhí)行

同理,需要int64 int32類型的隨機數(shù)只要修改隨機函數(shù)

但是需要注意 math/rand 幾個函數(shù)的取值區(qū)間!如Intn的范圍[0, n)。[0,20),20會取不到

我自己的需求這樣寫已足夠

c語言題目:有1、2、3、4個數(shù)字,能組成多少個互不相同且無重復(fù)數(shù)字的三位數(shù)?都是多少?(用go語言)

百位數(shù)有4種選擇,為與百位數(shù)不重復(fù),十位數(shù)就只有3種選擇了;同樣道理,個位數(shù)就只有2種選擇。所以1、2、3、4等4個數(shù)字能組成4x3x2共24種互不相等且沒有重復(fù)數(shù)字的3位數(shù)。根據(jù)上述原理,可用一個3層嵌套for循環(huán)來完成,代碼如下:

#include?"stdio.h"

int?main(int?argc,char?*argv[]){

int?i,j,k,t;

printf("A?total?of?%d?no?repeat?number?3-digits,?they?are?as?follows:\n",4*3*2);

for(t=0,i=1;i=4;i++)//百位數(shù)字有4種選擇

for(j=1;j=4;j++)//十位數(shù)字有3種選擇

if(j!=i)//遇到十位數(shù)字等于百位數(shù)字時跳過

for(k=1;k=4;k++)//個位數(shù)字只有2種選擇了

if(k!=i??k!=j)//個位數(shù)字與十位或百位數(shù)字相等時跳過

printf(++t%10???"%4d"?:?"%4d\n",i*100+j*10+k);//輸出該三位數(shù)

if(t%10)

printf("\n");

return?0;

}

擴展資料

#includestdio.h

main()

{

int i, j, k;

int m=0;

for(i=1;i5;i++)

for(j=1;j5;j++)

for(k=1;k5;k++)

{

if(i!=jk!=ji!=k)

{

printf("%d%d%d\n",i,j,k);

m++;

}

}

printf("%d\n",m);

getch();

}

Go語言。 怎樣讀取一行幾個數(shù)字。

package?main

import?"fmt"

func?main()?{

var?a,?b,?c?int

fmt.Scanf("%d%d%d",?a,?b,?c)

fmt.Println(a?+?b?+?c)

}

希望采納!

當(dāng)前題目:用go語言寫數(shù)字 go語言簡明教程
文章URL:http://muchs.cn/article44/hgiiee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)商城網(wǎng)站品牌網(wǎng)站設(shè)計、品牌網(wǎng)站制作用戶體驗、建站公司

廣告

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

外貿(mào)網(wǎng)站制作