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服务.用来处理一个请 ...
随机推荐
- 一文了解JSON
目录 JSON 在JavaScript 中的使用. json 的定义 json 的访问 json 的两个常用方法 JSON 在 在 java 中的使用 javaBean 和 和 json 的互转 Li ...
- 傅里叶级数 傅里叶变换 FFT 时域 频域 功率谱 能量谱 功率谱密度PSD
傅立叶级数是基于周期函数的,如果我们把周期推广到
- Redis常见问题和性能监控
1 Redis常见面试问题 1.1 Redis是单线程还是多线程 Redis不同版本之间采用的线程模型是不一样的,在Redis4.0版本之前使用的是单线程模型,在4.0版本之后增加了多线程的支持. 在 ...
- 小tips:使用vuecli2脚手架配置vant自定义主题
一:工程安装less.less-loader 配置版本如下: "devDependencies": { "less": "^3.0.4", ...
- ASP.NET Core – Data Protection & Azure Storage + Azure Key Vault
前言 以前就写过很多篇了 Asp.net core 学习笔记 ( Data protection ) Asp.net core 学习笔记 Secret 和 Data Protect Azure key ...
- Figma 学习笔记 – Frame
Frame = <div> Frame 就类似 HTML 中的 div, 它和形状 rectangle 特性上蛮相识的, 但是使用场景其实差很多, 所以不要搞错哦. (除了图片很少会用到 ...
- SpringBoot——整合SSM(主要整合MyBatis)
基于SpringBoot整合SSM SpringBoot整合Spring(不存在) SpringBoot整合SpringMVC(不存在) SpringBoot整合MyBatis(主要) Spring整 ...
- 简单上手 Vue Router
Vue Router 也随着 Vue3 的更新来到了 4 版本,来看一下怎么使用吧!(这里使用的是 composition API 和 TypeScript 模式) 安装 vue-router4 np ...
- 什么是 DOM
百度: DOM 定义:文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口.它是一种与平台和语言无关的应用程序接口(API),它可 ...
- MYSQL存储过程-练习4 loop循环
MYSQL存储过程-练习4 loop循环 创建存储过程 1 DELIMITER $$ 2 3 CREATE PROCEDURE `sp_loop`() 4 BEGIN 5 DECLARE i INT; ...