币圈数值转换
Posted 杰哥的技术杂货铺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了币圈数值转换相关的知识,希望对你有一定的参考价值。
我们经常可以在币安中看到,某交易对的成交量或者成交额都有一个M或者B的单位,那么本文带大家一起实现
一、疑问:
1. 数量单位B和M以及T代表多少?
- B是单词billion的缩写,1B=10亿
- M是单词million的缩写,1M=100万
- T是单词trillion的缩写,1T=1万亿
币圈m代表单位百万,1M在国际通行的说法是1M=1百万,欧洲银行业管理局将虚拟货币定义为:价值的数字化表示,不由央行或当局发行,也不与货币挂钩,但由于被公众所接受,所以可作为支付手段,也可以电子形式转移、存储或交易。
二、代码实现
首先需要有一些string数据类型的加减乘除运算方法
func Calc(a string, b string, op int, pcs int) (string, error)
decimal.DivisionPrecision = pcs
ad, err1 := decimal.NewFromString(a)
bd, err2 := decimal.NewFromString(b)
if err1 != nil || err2 != nil
return "0.00", errors.New(fmt.Sprintf("Calc fail,err1=%v,err2=%v", err1, err2))
if op == 1
ad = ad.Add(bd)
else if op == -1
ad = ad.Sub(bd)
else if op == 2
ad = ad.Div(bd)
else if op == 3
ad = ad.Mul(bd)
return fmt.Sprintf("%v", ad), nil
/**
a+b
*/
func Add(a string, b string) (r string, err error)
return Calc(a, b, 1, 20)
/**
a-b
*/
func Sub(a string, b string) (r string, err error)
return Calc(a, b, -1, 20)
/**
a/b
*/
func Div(a string, b string) (r string, err error)
return Calc(a, b, 2, 20)
/**
a*b
*/
func Mul(a string, b string) (r string, err error)
return Calc(a, b, 3, 20)
/**
s1 == s2
*/
func Equal(s1 string, s2 string) bool
a, err1 := decimal.NewFromString(s1)
b, err2 := decimal.NewFromString(s2)
if err1 != nil || err2 != nil
return false
return a.Equal(b)
/**
s1 < s2
*/
func LessThan(s1 string, s2 string) bool
a, err1 := decimal.NewFromString(s1)
b, err2 := decimal.NewFromString(s2)
if err1 != nil || err2 != nil
return false
return a.LessThan(b)
/**
s1 <= s2
*/
func LessThanOrEqual(s1 string, s2 string) bool
a, err1 := decimal.NewFromString(s1)
b, err2 := decimal.NewFromString(s2)
if err1 != nil || err2 != nil
return false
return a.LessThanOrEqual(b)
/**
s1 > s2
*/
func GreaterThan(s1 string, s2 string) bool
a, err1 := decimal.NewFromString(s1)
b, err2 := decimal.NewFromString(s2)
if err1 != nil || err2 != nil
return false
return a.GreaterThan(b)
/**
s1 >= s2
*/
func GreaterThanOrEqual(s1 string, s2 string) bool
a, err1 := decimal.NewFromString(s1)
b, err2 := decimal.NewFromString(s2)
if err1 != nil || err2 != nil
return false
return a.GreaterThanOrEqual(b)
其次需要有一个截取小数精度的方法
//小数精度截取
func PrecisionValue(value string, precision int) string
//判断字符中是否包含.
if ok := strings.Contains(value, "."); ok
//以.截取字符串
ss := strings.Split(value, ".")
var a string
//判断小数位是否大于精度,否则返回原值
if len(ss[1]) > precision
a = ss[1][:precision]
return (ss[0] + "." + a)
return value
下面便是添加B或者M的单位
//数值单位换算
func UnitValue(strnum string, precision int) string
sdivision := strings.Split(strnum, ".")
sl := sdivision[0]
if len(sl) >= 10
value, _ := libra.Div(sl, "1000000000")
return PrecisionValue(value, precision) + "B"
if len(sl) >= 7
value, _ := libra.Div(sl, "1000000")
return PrecisionValue(value, precision) + "M"
return PrecisionValue(strnum, precision)
以上是关于币圈数值转换的主要内容,如果未能解决你的问题,请参考以下文章
DB2中如果转换数值显示为两位小数,并显示千分位逗号要怎么写SQL?