我们经常可以在币安中看到,某交易对的成交量或者成交额都有一个M或者B的单位,那么本文带大家一起实现
一、疑问:
币圈m代表单位百万,1M在国际通行的说法是1M=1百万,欧洲银行业管理局将虚拟货币定义为:价值的数字化表示,不由央行或当局发行,也不与货币挂钩,但由于被公众所接受,所以可作为支付手段,也可以电子形式转移、存储或交易。
二、代码实现
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
}
//数值单位换算
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)
}
原文地址:https://blog.csdn.net/cljdsc/article/details/128413016
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_38906.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。