Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入
一、判斷幾位小數(shù)點(diǎn)
1.判斷幾位小數(shù)點(diǎn)
加載 cast 包
go get github.com/spf13/cast
代碼如下(示例):
package main
import (
"fmt"
"github.com/spf13/cast"
"math"
"regexp"
"strconv"
)
func main() {
num1 := 5.335
// 判斷幾位小數(shù)
decimal, _ := CheckDecimal(cast.ToString(num1), "2")
fmt.Println(decimal)
}
// CheckDecimal 判斷小數(shù)點(diǎn)后幾位小數(shù)點(diǎn)
// str 所要判斷的 小數(shù)字符串
// n 所要判斷的 位數(shù)
func CheckDecimal(str string, n string) (bool, error) {
// 通過(guò) regexp 的 正則比較
// ([1-9]\d*) 1-9 的任意位數(shù)
// (0) 或者第一位是 0
// d{0,`+n+`} 0-n 位數(shù)
return regexp.MatchString(`^(([1-9]\d*)|(0))(\.\d{0,`+n+`})?$`, str)
}
二、四舍五入
1.fmt.Sprintf
測(cè)試:
5.334
5.335
5.336
代碼如下(示例):
package main
import (
"fmt"
"github.com/spf13/cast"
"math"
"strconv"
)
func main() {
num1 := 5.334
fmt.Println(Float64Rand(num1,2))
}
//四舍五入
func Float64Rand(v float64, dig int) float64 {
cDig := strconv.Itoa(dig)
val := fmt.Sprintf("%0."+cDig+"f", v)
return cast.ToFloat64(val)
}結(jié)果

從結(jié)果可以知道,官方包 fmt的四舍五入功能 不能達(dá)到我們的完美預(yù)期,四舍可以完成,但五入失敗,只有當(dāng)?shù)谌怀蔀榱鶗r(shí)才可生效
2.math.Round(result*pow)
測(cè)試:
5.334
5.335
5.336
代碼如下(示例):
package main
import (
"fmt"
"github.com/spf13/cast"
"math"
"strconv"
)
func main() {
num1 := 5.334
fmt.Println("num1:",num1)
fmt.Println("res1:",FormatFloat(num1,2))
num2 := 5.335
fmt.Println("num2:",num2)
fmt.Println("res2:",FormatFloat(num2,2))
num3 := 5.336
fmt.Println("num3:",num3)
fmt.Println("res3:",FormatFloat(num3,2))
}
func FormatFloat(f float64, dig int) float64 {
result := cast.ToFloat64(strconv.FormatFloat(f, 'f', dig+1, 64))
pow := math.Pow(10, float64(dig))
return math.Round(result*pow) / pow
}結(jié)果

從結(jié)果可以知道,math.Round(result*pow) 可以達(dá)到我們的完美預(yù)期,四舍五入可以完成。
總結(jié)
當(dāng)官方包不足以滿足我們的需要時(shí),我們需要去尋找一個(gè)可以滿足需要的方法來(lái)實(shí)現(xiàn)想要的功能,也將會(huì)在之后努力通過(guò)官方包實(shí)現(xiàn)四舍五入,讓自己拓展知識(shí)面。
到此這篇關(guān)于Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入的文章就介紹到這了,更多相關(guān)Golang判斷小數(shù)點(diǎn)與四舍五入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
讓go程序以后臺(tái)進(jìn)程或daemon方式運(yùn)行方法探究
本文探討了如何通過(guò)Go代碼實(shí)現(xiàn)在后臺(tái)運(yùn)行的程序,最近我用Go語(yǔ)言開(kāi)發(fā)了一個(gè)WebSocket服務(wù),我希望它能在后臺(tái)運(yùn)行,并在異常退出時(shí)自動(dòng)重新啟動(dòng),我的整體思路是將程序轉(zhuǎn)為后臺(tái)進(jìn)程,也就是守護(hù)進(jìn)程(daemon)2024-01-01
初學(xué)Go必備的vscode插件及最常用快捷鍵和代碼自動(dòng)補(bǔ)全
這篇文章主要給大家介紹了關(guān)于初學(xué)vscode寫Go必備的vscode插件及最常用快捷鍵和代碼自動(dòng)補(bǔ)全的相關(guān)資料,由于vscode是開(kāi)源免費(fèi)的,而且開(kāi)發(fā)支持vscode的插件相對(duì)比較容易,更新速度也很快,需要的朋友可以參考下2023-07-07
Go語(yǔ)言中Timer計(jì)時(shí)器的使用技巧詳解
Go語(yǔ)言中的time包里有個(gè)Timer計(jì)時(shí)器的功能,這篇文章主要就是來(lái)和大家介紹一下Timer計(jì)時(shí)器的使用技巧,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
利用Go Plugin實(shí)現(xiàn)插件化編程的簡(jiǎn)單方法
Golang官方提供了plugin模塊,該模塊可以支持插件開(kāi),下面這篇文章主要給大家介紹了關(guān)于如何利用Go Plugin實(shí)現(xiàn)插件化編程的相關(guān)資料,需要的朋友可以參考下2021-10-10
Go語(yǔ)言針對(duì)Map的11問(wèn)你知道幾個(gè)?
Go?Map?的?11?連問(wèn),你頂?shù)昧寺?這篇文章小編為大家準(zhǔn)備了?Go?語(yǔ)言?Map?的?11?連問(wèn),相信大家看完肯定會(huì)有幫助的,感興趣的小伙伴可以收藏一波2023-05-05
Linux系統(tǒng)下Go語(yǔ)言開(kāi)發(fā)環(huán)境搭建
這篇文章主要介紹了Linux系統(tǒng)下Go開(kāi)發(fā)環(huán)境搭建,需要的朋友可以參考下2022-04-04
GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包
本文主要介紹了GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
詳解Go?語(yǔ)言如何通過(guò)測(cè)試保證質(zhì)量
這篇文章主要為大家介紹了Go?語(yǔ)言如何通過(guò)測(cè)試保證質(zhì)量詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08

