BigDecimal.ROUND_XXX的各种用法

在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。

1、ROUND_UP

舍入远离零的舍入模式。

在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。

注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN

接近零的舍入模式。

在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。

注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING

接近正无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;

如果为负,则舍入行为与 ROUND_DOWN 相同。

注意,此舍入模式始终不会减少计算值。

4、ROUND_FLOOR

接近负无穷大的舍入模式。

如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;

如果为负,则舍入行为与 ROUND_UP 相同。

注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。

如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

6、ROUND_HALF_DOWN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。

如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN    银行家舍入法

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。

如果前一位为奇数,则入位,否则舍去。

以下例子为保留小数点1位,那么这种舍入方式下的结果。

1.15>1.2 1.25>1.2

8、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。

如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

因为我们是属于互联网金融行业,所有在进行计算的时候尽量使用ROUND_HALF_EVEN    银行家舍入法

来源:http://www.cnblogs.com/yingchen/p/5459501.html

最好的炫富

老婆问老公:你知道最好的炫富方式是什么?

老公:买好车。老婆:错,别人以为是司机!

老公:戴好表。老婆:错,别人以为是高仿!

老公:那是什么?老婆:是把钱花在我身上,我保养的年轻漂亮,即使你穿个大裤衩子和拖鞋,只要我往你身边一站,别人就会说,这女的图他的钱!

老公:嗯,听着好有道理的样子!

Golang 在 Mac、Linux、Windows 下如何交叉编译

Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下。

Mac 下编译 Linux 和 Windows 64位可执行程序

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Linux 下编译 Mac 和 Windows 64位可执行程序

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Windows 下编译 Mac 和 Linux 64位可执行程序

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
GOARCH:目标平台的体系架构(386、amd64、arm)
交叉编译不支持 CGO 所以要禁用它

上面的命令编译 64 位可执行程序,你当然应该也会使用 386 编译 32 位可执行程序

很多博客都提到要先增加对其它平台的支持,但是我跳过那一步,上面所列的命令也都能成功,且得到我想要的结果,可见那一步应该是非必须的,或是我所使用的 Go 版本已默认支持所有平台。

作者:磐石区
来源:CSDN
原文:https://blog.csdn.net/panshiqu/article/details/53788067
版权声明:本文为博主原创文章,转载请附上博文链接!

阿里云物联网平台MQTT-TOPIC

物联网平台中,服务端和设备端通过 Topic 来实现消息通信。Topic是针对设备的概念,Topic类是针对产品的概念。

什么是Topic类?

为了方便海量设备基于海量 Topic 进行通信,简化授权操作,物联网平台增加了 Topic 类的概念。您创建产品后,物联网平台会为该产品自动创建默认的 Topic 类。并且,在您创建设备后,会自动将产品 Topic 类映射到设备上。您无需单独为每个设备授权 Topic。

图 1. Topic 自动生成示意图

在您创建产品后,物联网平台会自动为您的产品生成一些标准的 Topic 类。您可以在产品的消息通信页面,查看该产品的所有 Topic 类。

关于 Topic 类的说明:

  • Topic类是一类 Topic 的集合。例如,Topic 类:/${YourProductKey}/${YourDeviceName}/update是具体 Topic:/${YourProductKey}/device1/update/${YourProductKey}/device2/update的集合。
  • Topic类中必须以正斜线(/)进行分层,区分每个类目。其中,有两个类目为既定类目:${YourProductKey}表示产品的标识符 ProductKey;${YourDeviceName}表示设备名称。
  • 类目命名只能包含字母,数字和下划线(_)。每级类目不能为空。
  • 设备操作权限:发布表示设备可以往 Topic 发布消息;订阅表示设备可以从 Topic 订阅消息。
  • 基础版产品和高级版产品都支持自定义 Topic 类。您可以根据业务需求,通过自定义 Topic 类灵活地进行消息通信。
  • 系统 Topic 类是由系统预定义的 Topic 类,不支持用户自定义,不采用/${YourProductKey}开头。例如,高级版中,针对物模型所提供的 Topic 类一般以/sys/开头;固件升级相关的Topic类以/ota/开头;设备影子的 Topic 类以/shadow/开头。

什么是Topic?

产品的 Topic 类不用于通信,只是定义 Topic。用于消息通信的是具体的 Topic。

  • Topic 格式和Topic 类格式一致。区别在于 Topic 类中的变量${YourDeviceName},在 Topic 中则是具体的设备名称。
  • 设备对应的 Topic 是从产品 Topic 类映射出来,根据设备名称而动态创建的。设备的具体 Topic 中带有设备名称(即DeviceName),只能被该设备用于 Pub/Sub 通信。例如,Topic:/${YourProductKey}/device1/update归属于设备名为device1的设备,所以只能被设备 device1 用于发布、订阅消息,而不能被设备 device2 用于发布订阅消息。
  • 在配置规则引擎时,配置的 Topic 中可使用通配符,且同一个类目中只能出现一个通配符。
  • 表:Topic 通配符
通配符描述
#这个通配符必须出现在 Topic 的最后一个类目,代表本级及下级所有类目。例如, Topic:/YourProductKey/device1/#,可以代表/YourProductKey/device1/updateYourProductKey/device1/update/error
+代表本级所有类目。例如,Topic:/YourProductKey/+/update,可以代表/${YourProductKey}/device1/update/${YourProductKey}/device2/update