Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go语言的浮点型比较大小、与字符串互转、精准舍入

Go语言的浮点型比较大小、与字符串互转、精准舍入

作者头像
henrylee2cn
发布于 2019-04-04 07:24:48
发布于 2019-04-04 07:24:48
5.4K00
代码可运行
举报
文章被收录于专栏:Go实战Go实战
运行总次数:0
代码可运行

我们在编程中经常需要对两个浮点型比较大小,下面我就来分享一段这样的代码,同时也展示了Go语言函数式编程的独特魅力:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (
	"fmt"
	"math"
)

func main() {
	// 设置精确度为0.00001
	var a Accuracy = func() float64 { return 0.00001 }
	fmt.Println(a.Equal(0.11111222, 0.11111222233333)) //打印结果为:true
}

type Accuracy func() float64

func (this Accuracy) Equal(a, b float64) bool {
	return math.Abs(a-b) < this()
}

func (this Accuracy) Greater(a, b float64) bool {
	return math.Max(a, b) == a && math.Abs(a-b) > this()
}

func (this Accuracy) Smaller(a, b float64) bool {
	return math.Max(a, b) == b && math.Abs(a-b) > this()
}

func (this Accuracy) GreaterOrEqual(a, b float64) bool {
	return math.Max(a, b) == a || math.Abs(a-b) < this()
}

func (this Accuracy) SmallerOrEqual(a, b float64) bool {
	return math.Max(a, b) == b || math.Abs(a-b) < this()
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

再来分享一个较完整的处理浮点数的结构体——Floater

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (
	"fmt"
	"math"
	"strconv"
	"strings"
)

type Floater struct {
	numOfDecimalPlaces int
	accuracy           float64
	format             string
}

func NewFloater(numOfDecimalPlaces int) *Floater {
	if numOfDecimalPlaces < 0 || numOfDecimalPlaces > 14 {
		panic("the range of Floater.numOfDecimalPlaces must be between 0 and 14.")
	}
	var accuracy float64 = 1
	if numOfDecimalPlaces > 0 {
		accuracyString := "0." + strings.Repeat("0", numOfDecimalPlaces-1) + "1"
		accuracy, _ = strconv.ParseFloat(accuracyString, 64)
	}
	return &Floater{
		numOfDecimalPlaces: numOfDecimalPlaces,
		accuracy:           accuracy,
		format:             "%0." + strconv.Itoa(numOfDecimalPlaces) + "f",
	}
}

func (this *Floater) NumOfDecimalPlaces() int {
	return this.numOfDecimalPlaces
}

func (this *Floater) Accuracy() float64 {
	return this.accuracy
}

func (this *Floater) Format() string {
	return this.format
}

func (this *Floater) Ftoa(f float64) string {
	return fmt.Sprintf(this.format, f)
}

func (this *Floater) Atof(s string, bitSize int) (float64, error) {
	f, err := strconv.ParseFloat(s, bitSize)
	if err != nil {
		return f, err
	}
	return strconv.ParseFloat(fmt.Sprintf(this.format, f), bitSize)
}

func (this *Floater) Ftof(f float64) float64 {
	f, _ = strconv.ParseFloat(fmt.Sprintf(this.format, f), 64)
	return f
}

func (this *Floater) Atoa(s string, bitSize int) (string, error) {
	f, err := strconv.ParseFloat(s, bitSize)
	if err != nil {
		return s, err
	}
	return fmt.Sprintf(this.format, f), nil
}

func (this *Floater) Equal(a, b float64) bool {
	return math.Abs(a-b) < this.accuracy
}

func (this *Floater) Greater(a, b float64) bool {
	return math.Max(a, b) == a && math.Abs(a-b) > this.accuracy
}

func (this *Floater) Smaller(a, b float64) bool {
	return math.Max(a, b) == b && math.Abs(a-b) > this.accuracy
}

func (this *Floater) GreaterOrEqual(a, b float64) bool {
	return math.Max(a, b) == a || math.Abs(a-b) < this.accuracy
}

func (this *Floater) SmallerOrEqual(a, b float64) bool {
	return math.Max(a, b) == b || math.Abs(a-b) < this.accuracy
}

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/09/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go 语言字符串使用方式与技巧
关于 Go 语言字符串的使用,我们需要了解标准库 strconv 和标准库 strings 的使用方式,它们分别用于字符串类型转换和字符串操作。
frank.
2023/12/14
2470
Go 语言字符串使用方式与技巧
Golang不同类型比较
在日常开发过程中难免会遇到各个类型的变量的比较以及运算操作,这里我们做了一些简单的汇总,希望能给各位同学在开发中带来帮助。
孤烟
2020/09/27
1.2K0
[日常] Go语言圣经--浮点数习题
练习 3.1: 如果f函数返回的是无限制的float64值,那么SVG文件可能输出无效的多边形元素(虽然许多SVG渲染器会妥善处理这类问题)。修改程序跳过无效的多边形。
唯一Chat
2019/09/10
9750
[日常] Go语言圣经--浮点数习题
【Go】四舍五入在go语言中为何如此困难
四舍五入是一个非常常见的功能,在流行语言标准库中往往存在 Round 的功能,它最少支持常用的 Round half up 算法。
thinkeridea
2021/01/04
1.4K0
[go 标准库] strconv
go strconv 包提供了基本数据类型与 string 类型相互转换常用的处理函数。提供了如下操作接口:
柳公子
2021/05/06
9540
第七章 字符串
字符串可以使用 双引号(" ")或者 反引号(` `)来创建。双引号用来创建可解析的字符串,但不能用来引用多行,这也是大多数字符串的定义方式。
宇宙之一粟
2020/10/26
2820
第七章 字符串
12.Go复合类型-字符串转换
上一篇章,我们学习了 字符串 处理的相关函数方法,本篇章来看看 字符串转换 的相关函数方法。
Devops海洋的渔夫
2022/01/17
2860
区块链开发之Go语言—字符串和字节
字符串与字节的关系 Go 代码使用 UTF-8 编码,字符串和字节之间的转换依据的是UTF-8编码。注意中文是3个字节对应一个中文的字符串。 下面将归类讲述负责操作字符串和字节的几个标准库 strings 包提供了很多操作字符串的简单函数,通常一般的字符串操作需求都可以在这个包中找到。 bytes 包提供了对应操作字节的函数。 strconv 包提供了基本数据类型和字符串之间的转换。这个包之所以存在,是因为在Go中,没有隐式类型转换。字符串类型和 int、float、bool 等类型之间的转换却没有这么简单
linxinzhe
2018/04/10
1.4K0
Go | 基本数据类型的相互转换
n1为int32, n2为int16, 所以先把加数n1转换成int16, 再做加法
甜点cc
2022/11/02
3210
Go | 基本数据类型的相互转换
Go 编程 | 连载 06 - 基本数据类型转换(strconv)
ParseFloat() 可以将字符串转换为 float 类型,由于 float 类型分为 float32 和 float64,所有 ParseFloat() 有两个参数,第一个参数为 string,第二个参数就是 bitSize,既要转换成 float32(32 个二进制位 bit,占 4 个字节) 还是 float64(64 个二进制位 bit,占 8 个字节)。
RiemannHypothesis
2022/09/26
4380
Go 编程 | 连载 06 - 基本数据类型转换(strconv)
go语言学习-类型转换
1.字符串到整形(string to int):ParseInt 返回的是 int64
solate
2019/07/19
1K0
Go语言学习系列——基础语法——【坚果派-红目香薰】
红目香薰
2025/03/06
1040
Go语言学习系列——基础语法——【坚果派-红目香薰】
捋一捋Go语言的一个类型转换工具包strconv包
Hey,大家好,我是码农,星期八,这次咱们来学一下Go语言的一个类型转换工具包strconv。
Go进阶者
2021/03/24
9420
捋一捋Go语言的一个类型转换工具包strconv包
go的数据类型-基本数据类型-字符串型
在计算机编程中,字符串型是一种表示文本数据的数据类型。在Go语言中,字符串型用string表示,可以用来存储文本、文件路径、URL等数据。
堕落飞鸟
2023/04/19
2000
GoLang中基本数据类型之间的转换
转换的时候建议从低位转换成高位,高位转换成低位的时候如果转换不成功就会溢出,和我们想的结果不一样。
BUG弄潮儿
2024/01/24
3210
GoLang中基本数据类型之间的转换
『Go 内置库第一季:strconv』
日常编写代码的过程中,字符串和数值型、布尔类型之间的转换算是很频繁了。所以有必要研究下内置的 strconv 库。
谢伟
2018/12/05
1.1K0
一文搞懂Go语言标准库,strconv
func ParseBool(str string) (value bool, err error)
微客鸟窝
2022/01/05
6760
golang学习笔记5:字符串及相关函数
字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。UTF-8 是被广泛使用的编码格式,是文本文件的标准编码,其它包括 XML 和 JSON 在内,也都使用该编码。由于该编码对占用字节长度的不定性,Go 中的字符串也可能根据需要占用 1 至 4 个字节,这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字节)。Go 这样做的好处是不仅减少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。 字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲,字符串是字节的定长数组。 Go 支持以下 2 种形式的字面值:
JKXQJ
2018/10/22
1.3K0
一文了解 Go 标准库 strconv
本文以 string 类型为中心,通过 strconv 标准库,介绍其与其他基本数据类型相互转换的函数。
陈明勇
2023/10/15
4920
一文了解 Go 标准库 strconv
Golang浮点型的默认舍入规则——四舍六入五成双
四舍六入五成双是一种比较精确比较科学的计数保留法,是一种数字修约规则,又名银行家舍入法。它比通常用的四舍五入法更加精确。
henrylee2cn
2019/04/04
4.2K0
相关推荐
Go 语言字符串使用方式与技巧
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验