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

 更新时间:2022年03月03日 10:23:56   作者:头秃猫轻王  
这篇文章主要给大家介绍了关于Golang小数操作指南之判断小数点位数与四舍五入的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、判断几位小数点

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

结果

从结果可以知道,官方包 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
}

结果

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

总结

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

到此这篇关于Golang小数操作指南之判断小数点位数与四舍五入的文章就介绍到这了,更多相关Golang判断小数点与四舍五入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 让go程序以后台进程或daemon方式运行方法探究

    让go程序以后台进程或daemon方式运行方法探究

    本文探讨了如何通过Go代码实现在后台运行的程序,最近我用Go语言开发了一个WebSocket服务,我希望它能在后台运行,并在异常退出时自动重新启动,我的整体思路是将程序转为后台进程,也就是守护进程(daemon)
    2024-01-01
  • 初学Go必备的vscode插件及最常用快捷键和代码自动补全

    初学Go必备的vscode插件及最常用快捷键和代码自动补全

    这篇文章主要给大家介绍了关于初学vscode写Go必备的vscode插件及最常用快捷键和代码自动补全的相关资料,由于vscode是开源免费的,而且开发支持vscode的插件相对比较容易,更新速度也很快,需要的朋友可以参考下
    2023-07-07
  • Go语言中Timer计时器的使用技巧详解

    Go语言中Timer计时器的使用技巧详解

    Go语言中的time包里有个Timer计时器的功能,这篇文章主要就是来和大家介绍一下Timer计时器的使用技巧,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • 利用Go Plugin实现插件化编程的简单方法

    利用Go Plugin实现插件化编程的简单方法

    Golang官方提供了plugin模块,该模块可以支持插件开,下面这篇文章主要给大家介绍了关于如何利用Go Plugin实现插件化编程的相关资料,需要的朋友可以参考下
    2021-10-10
  • Go 分布式链路追踪实现原理解析

    Go 分布式链路追踪实现原理解析

    分布式链路追踪作为解决分布式应用可观测问题的重要技术,愈发成为分布式应用不可缺少的基础设施,本文将详细介绍分布式链路的核心概念、架构原理和相关开源标准协议,并分享我们在实现无侵入 Go 采集 Sdk 方面的一些实践,需要的朋友可以参考下
    2022-06-06
  • Go语言针对Map的11问你知道几个?

    Go语言针对Map的11问你知道几个?

    Go Map 的 11 连问,你顶得了嘛?这篇文章小编为大家准备了 Go 语言 Map 的 11 连问,相信大家看完肯定会有帮助的,感兴趣的小伙伴可以收藏一波
    2023-05-05
  • Linux系统下Go语言开发环境搭建

    Linux系统下Go语言开发环境搭建

    这篇文章主要介绍了Linux系统下Go开发环境搭建,需要的朋友可以参考下
    2022-04-04
  • GoLang之标准库encoding/json包

    GoLang之标准库encoding/json包

    本文主要介绍了GoLang之标准库encoding/json包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • go语言实现抓取高清图片

    go语言实现抓取高清图片

    本文给大家分享的是使用go语言实现的抓取高清美女图片的代码,原理非常简单,这里就不多废话了,主要是看到很多小伙伴使用python实现的,心血来潮就用go写了下,推荐给大家。
    2015-03-03
  • 详解Go 语言如何通过测试保证质量

    详解Go 语言如何通过测试保证质量

    这篇文章主要为大家介绍了Go 语言如何通过测试保证质量详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论