币圈数值转换

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?

数值转换

如何将整数位数组转换为整数值?

在verilog设计中,如何将特定位数的数值转换成32位signed型?

excel中以文本格式储存的数字转换成数字后,小数点后的数字消失了,数值自动四舍五入为整数?