目录
  • 一、判断几位小数点
    • 1.判断几位小数点
  • 二、四舍五入
    • 1.fmt.Sprintf
    • 2.math.Round(result*pow)
  • 总结

    一、判断几位小数点

    1.判断几位小数点

    加载 cast 包

    go get github.com/spf13/cast

    代码如下(示例):

    package main
    import (
    	"fmt"
    	"github.com/spf13/cast"
    	"math"
    	"regexp"
    	"strconv"
    )
    
    func main() {
    	num1 := 5.335
    	// 判断几位小数
    	decimal, _ := CheckDecimal(cast.ToString(num1), "2")
    	fmt.Println(decimal)
    
    }
    
    // CheckDecimal 判断小数点后几位小数点
    // str 所要判断的 小数字符串
    // n 所要判断的 位数
    func CheckDecimal(str string, n string) (bool, error) {
    	// 通过 regexp 的 正则比较
    	// ([1-9]\d*) 1-9 的任意位数
    	// (0) 或者第一位是 0
    	// d{0,`+n+`} 0-n 位数
    	return regexp.MatchString(`^(([1-9]\d*)|(0))(\.\d{0,`+n+`})?$`, str)
    }
    

    二、四舍五入

    1.fmt.Sprintf

    测试:

    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)
    }

    结果

    Golang小数操作指南之判断小数点位数与四舍五入

    从结果可以知道,官方包 fmt的四舍五入功能 不能达到我们的完美预期,四舍可以完成,但五入失败,只有当第三位成为六时才可生效

    2.math.Round(result*pow)

    测试:

    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
    }

    结果

    Golang小数操作指南之判断小数点位数与四舍五入

    从结果可以知道,math.Round(result*pow) 可以达到我们的完美预期,四舍五入可以完成。

    总结

    当官方包不足以满足我们的需要时,我们需要去寻找一个可以满足需要的方法来实现想要的功能,也将会在之后努力通过官方包实现四舍五入,让自己拓展知识面。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。