币圈数值转换

本文介绍了数字货币交易中常见的单位B、M和T的含义,分别代表十亿、百万和万亿。并提供了一组Go语言代码实现数值的加减乘除运算,以及单位转换和精度控制。通过`UnitValue`函数可以将数值转换为带有B或M单位的形式,精确到指定的小数位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们经常可以在币安中看到,某交易对的成交量或者成交额都有一个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)
}
<think>好的,用户让我介绍一下CompletableFuture的completedFuture方法。首先,我需要确认自己对Java的CompletableFuture的理解是否正确。completedFuture是一个静态方法,用于创建一个已经完成的CompletableFuture实例,对吧?它的主要用途是在需要立即返回结果的情况下,避免异步执行的等待时间。 接下来,我应该回忆一下这个方法的具体用法。比如,用户可能想知道如何调用它,返回类型是什么,以及它在实际开发中的典型应用场景。比如,当某个操作的结果已经准备好,但需要保持与异步任务相同的接口时,可以用completedFuture包装结果,这样其他依赖的异步操作可以继续链式调用。 然后,可能需要考虑这个方法与其他方法的区别,比如supplyAsync或runAsync,这两个方法通常用于启动异步任务,而completedFuture则是立即完成的任务。这时候需要注意异常处理的情况,因为completedFuture返回的Future不会有执行异常,因为它已经完成,但如果是手动抛出异常的情况呢?比如,如果结果本身是一个异常,可能需要使用completeExceptionally,但completedFuture本身不接受异常参数。 另外,用户提供的链接提到该方法用于创建一个已经包含结果的CompletableFuture,而不需要等待异步任务完成。我需要确保解释清楚这一点,可能举一个例子,比如在测试中模拟立即完成的异步操作,或者作为默认返回值,避免空指针等问题。 还要注意语法格式,用户要求所有行内数学表达式用$...$,独立公式用$$...$$,但这个问题主要涉及代码,可能不需要数学公式。不过如果有涉及计算的例子,可能需要用LaTeX格式。但当前主题是Java方法,可能更多的是代码块解释。 然后,用户要求结构清晰,分步解释。可能需要先介绍方法的作用,然后说明使用场景,接着给出示例代码,并解释每个部分的作用。最后,可能对比其他方法,或者提到注意事项。 需要检查是否所有LaTeX语法正确,比如代码中的符号是否需要转义。比如在代码示例中,可能需要用反引号包裹代码,而LaTeX的数学表达式在这里可能不适用,但用户可能希望代码部分用正确的格式展示。 另外,用户要求使用中文回答,所以需要确保整个回答都是中文,并且术语准确,比如“异步任务”、“链式调用”等。 最后,确保回答真实可靠,可能需要参考官方文档或可靠的资料,比如Oracle的Java文档,或者权威的技术博客,但用户提供的链接是优快云的一篇文章,可能需要简要引用其中的内容,但主要依据自己的知识。 总结回答结构: 1. 方法定义:静态方法,返回已完成的CompletableFuture。 2. 用途:立即返回结果,无需等待异步处理。 3. 使用场景:测试、快速返回、组合异步操作。 4. 示例代码:展示如何创建使用completedFuture。 5. 注意事项:与异常处理、与其他方法的区别。 现在需要将这些点组织成连贯的段落,分步骤解释,确保结构清晰,符合用户要求。</think>以下是对 `CompletableFuture.completedFuture()` 方法的介绍,分步说明其作用使用场景: --- ### **1. 方法定义** `CompletableFuture.completedFuture()` 是 Java 8 引入的 `CompletableFuture` 类的一个静态方法,其签名如下: ```java public static <U> CompletableFuture<U> completedFuture(U value) ``` - **作用**:创建一个已完成的 `CompletableFuture` 对象,并直接包含结果 `value`。 - **返回值**:状态为 `completed` 的 `CompletableFuture`,结果立即可用。 --- ### **2. 核心用途** 此方法用于**快速生成一个已完成的异步任务**,适用于以下场景: - **无需异步计算**:结果已存在,无需耗时操作。 - **接口兼容性**:需要返回 `CompletableFuture` 类型,但结果已就绪。 - **链式调用**:作为异步操作链的起点或中间节点。 --- ### **3. 使用示例** #### **场景**:直接返回已知结果 ```java CompletableFuture<String> future = CompletableFuture.completedFuture("Hello, World!"); future.thenAccept(result -> System.out.println(result)); // 立即输出 "Hello, World!" ``` - **说明**:`future` 创建时已处于完成状态,后续回调(如 `thenAccept`)会立即执行。 --- #### **场景**:组合多个异步任务 ```java CompletableFuture<String> task1 = CompletableFuture.completedFuture("Data"); CompletableFuture<Integer> task2 = task1.thenApply(data -> data.length()); task2.thenAccept(len -> System.out.println("Length: " + len)); // 输出 "Length: 4" ``` - **说明**:`task1` 直接提供结果,`task2` 基于 `task1` 的结果继续处理。 --- ### **4. 对比其他方法** - **与 `supplyAsync()` 的区别**: - `supplyAsync(() -> value)` 会通过线程池异步执行,而 `completedFuture(value)` 直接返回完成状态。 - 示例: ```java // 异步执行(可能稍后完成) CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> "Hello"); // 立即完成 CompletableFuture<String> syncFuture = CompletableFuture.completedFuture("Hello"); ``` --- ### **5. 注意事项** - **异常处理**:`completedFuture` 生成的对象不会抛出执行异常。若需模拟异常,需用 `completeExceptionally()`: ```java CompletableFuture<String> failedFuture = new CompletableFuture<>(); failedFuture.completeExceptionally(new RuntimeException("Error")); ``` - **性能优化**:避免在高频调用中使用,频繁创建对象可能影响性能。 --- ### **总结** `CompletableFuture.completedFuture()` 是一个工具方法,用于简化代码逻辑,尤其在结果已知或需要快速构建异步操作链时非常实用。通过直接返回已完成的任务,它能够无缝集成到复杂的异步编程模型中,同时保持代码简洁性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥的技术杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值