首页 > 其他分享 >golang之浮点数处理库decimal

golang之浮点数处理库decimal

时间:2023-08-07 12:57:31浏览次数:36  
标签:decimal 浮点数 golang v1 v2 var Decimal log

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
}

 

标签:decimal,浮点数,golang,v1,v2,var,Decimal,log
From: https://www.cnblogs.com/xingxia/p/golang_decimal.html

相关文章

  • 初识Go(Golang)语言
    初识Go(Golang)语言Go的诞生1.Go语言的发展历程 2007年,谷歌工程师RobPike,KenThompson和RobertGriesemer开始设计一门全新的语言,这是Go语言的最初原型。 2009年11月10日,Google将Go语言以开放源代码的方式向全球发布。 2015年8月19日,Go1.5版发布,本次......
  • [Go笔记] 基础-01: Golang发展简史、著名项目及基本使用
    引言Golang,又称Go语言,是一门开源的静态类型编译型编程语言。自从2007年由谷歌的罗伯特·格里泽默(RobertGriesemer)、罗布·派克(RobPike)和肯·汤普森(KenThompson)共同设计,Go语言已经成为了众多开发者的首选。发展史2009年11月,Go语言正式对外公布。2012年,Go1.0版本发布。自那......
  • BigDecimal判断整除/除尽
    整除:在除法中只有被除数、除数和商都是整数的情况下,才可以说是“整除”。除尽:在除法中只要除到某一位时没有余数,不管被除数、除数和商是整数还是小数,都可以说是“除尽”。BigDecimal判断是否能被整除/***判断被除数是否能被除数整除**@paramdividend被除数*@paramdivisor......
  • golang 接口的概念
    先上代码定义一个接口Retriever两个接口的实现infra.gopackagemainimport( "fmt" "robot.com/Robot/learngo/testing" //"robot.com/Robot/learngo/infra")//?:Somethingthatcan"Get"typeretrieverinterface{ Get(string)s......
  • 从一道面试题来谈谈Golang中的 ==
    写这篇文章的时候,已经离我找工作有一段时间了,但是觉得这道题不管是面试还是日常的工作中,都会经常遇到,所以还是特意写一篇文章,记录下自己对Golang中==的理解。如文章中出现不对的地方,请不吝赐教,谢谢。注意,以下文章内容是基于go1.16.4进行演示的,如果和你验证时,结果不一致,可能Go......
  • golang之sync包
    介绍sync包中常用的方法, -sync:提供基本的同步原语(比如Mutex、RWMutex、Locker)和工具类(Once、WaitGroup、Cond、Pool、Map)-sync/atomic:提供变量的原子操作(基于硬件指令compare-and-swap) [Once] [WaitGroup] 一个WaitGroup对象可以等待一组协程结束。使用方法是:......
  • Golang 使用 JSON unmarshal 数字到 interface{} 数字变成 float64 类型
    最近在golang业务开发时,遇到一个坑。我们有个服务,会接收通用的interface对象,然后去给用户发消息。因此会涉及到把各个业务方传递过来的字符串,转成interface对象。但是因为我的字符串里有一个数字,比如下面demo里的{"number":1234567},而且数字是7位数,在经过json.Unmarshal后,被转成......
  • VScode 中golang 基准测试 go test -bench .
    目的:基准测试的主要目的是比较不同实现方式之间的性能差异,找出性能瓶颈。1准备以_test.go结尾文件和导入testing包在命名文件时需要让文件必须以_test结尾,在文件中导入testing包。基准测试可以测试一段程序的运行性能及耗费CPU的程度,获得代码内存占用和运行效率的性能数据。G......
  • 我用 GPT-4 生成了性能全网第一的 Golang Worker Pool,轻松打败 GitHub 万星项目
    目录1.我写了一个超牛的开源项目1.1你看看这性能1.2你看看这功能1.3你猜我这一百天都经历了啥2.你有多久没写并发程序了?3.问:一个WorkerPool程序需要包含哪些功能?4.让GPT-4写第一行代码!4.1我对GPT-4说4.2GPT-4回答4.3我又对GPT-4说4.4GPT-4......
  • golang用pgx查询数据时如何将查询结果方便的放入Map中
    pgx库简介下面是来自官网的简介:pgx-PostgreSQL驱动和工具包pgx是一个用于PostgreSQL的纯Go语言驱动和工具包。pgx驱动是一个底层的高性能接口,暴露了PostgreSQL特有的功能,如LISTEN/NOTIFY和COPY。它还包含一个标准database/sql接口的适配器。工具包组件是一组相关的包,实......