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() // 字符串
  IntPart()  // 返回整数部分
  
}

项目实战:

// 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的更多相关文章

  1. golang调用c动态库

    golang调用c动态库 简介 golang调用c语言动态库,动态方式调用,可指定动态库路径,无需系统目录下 核心技术点 封装c动态库 go语言调用c代码 实例代码 封装c动态库 头文件 test_s ...

  2. Golang go get第三方库的坑

    在树莓派上go get fail的问题记录及解决方案 go get github.com/terrancewong/serial # 错误为GOPATH路径的问题 cannot find packag ...

  3. golang操作redis/go-redis库

    目录 Redis介绍 Redis支持的数据结构 Redis应用场景 准备Redis环境 go-redis库 安装 连接 普通连接 V8新版本相关 连接Redis哨兵模式 连接Redis集群 基本使用 ...

  4. golang中的标准库template

    html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...

  5. Go 每日一库之 go-carbon,优雅的golang日期时间处理库

    Carbon 是一个轻量级.语义化.对开发者友好的 golang 时间处理库,支持链式调用. Carbon 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧. github.c ...

  6. Golang 通用连接池库 Golang-Pool

    Golang 实现的连接池 功能: * 连接池中连接类型为interface{},使得更加通用 * 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题 * 使用channel处理池 ...

  7. [Golang学习笔记] 03 库源码文件

    库源码文件:不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用. 代码包声明的基本规则: 1. 同目录下的源码文件的代码包声明语句要一致.也就是说,它们要同属于一个代码包( ...

  8. golang中的标准库数据格式

    数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...

  9. golang中的标准库context解读

    简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...

  10. golang中的标准库context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...

随机推荐

  1. 生产级Redis 高并发分布式锁实战2:缓存架构设计问题优化

    对于大多数高并发场景,都是读多写少.比如商品信息,医生挂号信息等.提交订单页只有一个操作. 对于一个普通的缓存架构设计,实现商品的增删改查功能,代码如下: Controller 层 @RestCont ...

  2. ComfyUI 基础教程(二) —— Stable Diffusion 文生图基础工作流及常用节点介绍

    上一篇文章讲解述首次启动 ComfyUI 会自动打开一个最基础的文生图工作流.实际上,后续我们可以通过菜单选项,或者快捷键 ctrl + D来打开这个默认工作流.默认工作流如下: 这是一个最基础的文生 ...

  3. 18 Python如何操作文件?

    本篇是 Python 系列教程第 18 篇,更多内容敬请访问我的 Python 合集 1 打开文件 通常使用内置的 open(文件路径, 模式, encoding="utf-8") ...

  4. 技术解析 | ZEGO 移动端超分辨率技术

    ​ 即构超分追求:速度更快.效果更好.码率更低.机型更广. 超分辨率(Super Resolution, SR)是从给定的低分辨率(Low Resolution, LR)图像中恢复高分辨率(High ...

  5. UC_Center整合单点登录后远程注册不激活问题的解决办法

    修改:bbs目录\uc_server\model\user.php 下方法add_user 如下: function add_user($username, $password, $email, $u ...

  6. JavaScript – 类型转换

    介绍 JS 是弱类型语言, 在编程时, 有许多自动类型转换的技巧, 虽然大家都不太鼓励, 尤其是用了 TypeScript 之后, 但无可否认自动转换很方便, 看上去也很干净. 所以这篇还是要介绍一些 ...

  7. Tomcat——IDEA中创建 Maven Web 项目

    IDEA中创建 Maven Web 项目    首先创建一个新的空项目        1.使用骨架      新建模块-找到如下骨架-创建              删除pom.xml中多余的坐标   ...

  8. 手搓大模型Task01:LLama3模型讲解

    前言   主要进行Qwen模型架构进行讲解. 1.Qwen整体介绍   Qwen的整体架构与Llama2类似,如下图所示: tokenizer将文本转为词表里面的数值. 数值经过embedding得到 ...

  9. T2 的莫反式子

    正在实现,不知道对不对,但是先放这,哪个大佬发现问题了和我说下 设 \[f(l)=\sum\cdots\sum[\gcd=1,\text{lcm}=l] \] \[g(l)=\sum\cdots\su ...

  10. [TK] 颜色

    谴责这道题发明在线莫队的人,简直就是异端,还好我给在线莫队卡了,支持正义制裁 题意简述 给定序列,设 \(f(l,r,x)\) 表示 \(x\) 在 \([l,r]\) 内的出现次数,对给定 \(l, ...