golang之浮点数处理库decimal
decimal库包是用来解决float类型对象之间运算不准确的问题的。
所以,如果你想使用decimal库包,你必须先把float类型对象通过decimal.NewFromFloat()函数转成decimal.Decimal类型,然后再计算,最后还得再转成你所需要的类型。
范例:
package main
import "log"
func main() {
a := 1129.6
log.Println(a * 100) //输出:112959.99999999999
var b float64 = 1129.6
log.Println(b * 100) //输出:112959.99999999999
m1 := 8.2
m2 := 3.8
log.Println(m1 - m2) // 期望是4.4,结果打印出了4.399999999999999
}
// 输出的结果是:
2023/03/16 13:38:24 112959.99999999999
2023/03/16 13:38:24 112959.99999999999
2023/03/16 13:38:24 4.3999999999999995
// 从上面的输出结果看到,数值的精度出现了一定程度的变化,这显然不是我们想要的结果。
解决:
由于golang中默认是没有decimal类型的,所以要解决上述的问题,需要使用第三方库包decimal decimal.Decimal是一种数据类型
go get github.com/shopspring/decimal
使用:
package main import (
"fmt"
"log"
"github.com/shopspring/decimal"
) func main() {
var v1 = decimal.NewFromFloat(0.1) // 声明一个decimal.Decimal类型的变量v1
var v2 = decimal.NewFromFloat(0.2) // 声明一个decimal.Decimal类型的变量v2
// 支持从其他数据类型中解析浮点型数据 NewFromString / NewFromFloat32 / NewFromInt() ... // decimal.Decimal类型变量之间的加减乘除
// 所得到的结果也是decimal.Decimal类型
var v3 = v1.Add(v2) // 0.3
var v4 = v1.Sub(v2) // -0.1
var v5 = v1.Mul(v2) // 0.02
var v6 = v1.Div(v2) // 0.5 // 声明一个decimal.Decimal类型的对象
var v7 = decimal.NewFromFloat(3.4625)
var data1 = v7.Round(1) // 3.5,保留一位小数,四舍五入的方式
var data2 = v7.Truncate(1) // 3.4,保留一位小数,直接舍弃,直接截断的方式 log.Println(v3, v4, v5, v6)
log.Println(data1, data2) // 输出的结果是
0.3 -0.1 0.02 0.5
3.5 3.4 // 最后别忘了还需要转换成你所需要的数据类型
decimal.NewFromFloat(nums).Round(2).Float64() // 四舍五入保留2位小数,最后再转换为float64类型
// 转换成其他数据类型
Float64() // 浮点型
String() // 字符串
}
项目实战:
// Fen2Yuan 分转元
func Fen2Yuan[K int | uint](price K) (res float64) {
d := decimal.New(1, 2)
res, _ = decimal.NewFromInt(int64(float64(price))).DivRound(d, 2).Float64()
return
} // Yuan2Fen 元转分
func Yuan2Fen(price float32) (yuan int64) {
p := decimal.NewFromFloat32(price)
yuan = p.Mul(decimal.NewFromInt(100)).IntPart()
return
}
golang之浮点数处理库decimal的更多相关文章
- golang调用c动态库
golang调用c动态库 简介 golang调用c语言动态库,动态方式调用,可指定动态库路径,无需系统目录下 核心技术点 封装c动态库 go语言调用c代码 实例代码 封装c动态库 头文件 test_s ...
- Golang go get第三方库的坑
在树莓派上go get fail的问题记录及解决方案 go get github.com/terrancewong/serial # 错误为GOPATH路径的问题 cannot find packag ...
- golang操作redis/go-redis库
目录 Redis介绍 Redis支持的数据结构 Redis应用场景 准备Redis环境 go-redis库 安装 连接 普通连接 V8新版本相关 连接Redis哨兵模式 连接Redis集群 基本使用 ...
- golang中的标准库template
html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...
- Go 每日一库之 go-carbon,优雅的golang日期时间处理库
Carbon 是一个轻量级.语义化.对开发者友好的 golang 时间处理库,支持链式调用. Carbon 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧. github.c ...
- Golang 通用连接池库 Golang-Pool
Golang 实现的连接池 功能: * 连接池中连接类型为interface{},使得更加通用 * 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题 * 使用channel处理池 ...
- [Golang学习笔记] 03 库源码文件
库源码文件:不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用. 代码包声明的基本规则: 1. 同目录下的源码文件的代码包声明语句要一致.也就是说,它们要同属于一个代码包( ...
- golang中的标准库数据格式
数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...
- golang中的标准库context解读
简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...
- golang中的标准库context
在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...
随机推荐
- python操作ipv6_用python开启临时http服务器及其ipv6支持
https://blog.csdn.net/weixin_35647799/article/details/112023159
- 解决Mac安装软件的“已损坏,无法打开...”问题
解决Mac安装软件的"已损坏,无法打开. 您应该将它移到废纸篓"问题 不管在安装时会遇到以已损坏无法打开的困惑, 解决: 一.允许"任何来源"开启 苹果从mac ...
- SimCLR: 一种视觉表征对比学习的简单框架《A Simple Framework for Contrastive Learning of Visual Representations》(对比学习、数据增强算子组合,二次增强、投影头、实验细节很nice),好文章,值得反复看
现在是2024年5月18日,好久没好好地看论文了,最近在学在写代码+各种乱七八糟的事情,感觉要和学术前沿脱轨了(虽然本身也没在轨道上,太菜了),今天把师兄推荐的一个框架的论文看看(视觉CV领域的). ...
- JavaScript – ECMAScript 版本
参考 TC39.ECMA-262.ECMAScript 的一些事儿 简史 es3 千禧年后稳定版 es4 革命版本, 最后在 2008 年难产了 es5 2009 年推出, 拿了 es4 一些比较简单 ...
- Scala编程语言基本常识
本文参考来源: Scala编程语言基本常识 – 萌面人博客 一 基本常识 Scala被称为大数据的黄金语言,它的发明人是马丁奥德斯基(Martin Odersky) 2001年诞生,融合了Ja ...
- 原生CSS、HTML 和 JavaScript 实现酷炫表单
一直使用 Vue/React ,习惯了用组件,偶尔想用原生三剑客写点 Demo 发现样式丑的不忍直视.最近看 掘金小册<玩转CSS的艺术之美>看到 CSS 相关的内容,发现原生 CSS 也 ...
- 4.2 等差数列及其前n项和
\(\mathbf{{\large {\color{Red} {欢迎到学科网下载资料学习}} } }\)[[高分突破系列]高二数学下学期同步知识点剖析精品讲义! \(\mathbf{{\large { ...
- 关于CycleGAN损失函数的可视化理解
看了<Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks>这篇论文,大致了解了C ...
- CSharp的Where底层实现
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- 有封装过v-model相关的双向绑定组件吗?
有的,之前在做⼀个通⽤的上传组件的时候,⼀开始是通过传统的⽗⼦通信实现的,⽗传⼦实现的图⽚ 回显,⼦传⽗实现的图⽚url抛出传给给接⼝,后来使⽤v-model做了⼀点优化,简单了不少 追问: 具体是怎 ...