上去几个月做了一个项目,上游方传过来的金额数据是负的,当时我有疑惑,后面问了上游说数据没有负的,鉴于数据存储用了int类型,对应的最大值是2147483647,即2亿多。由于存储的金额按照最小单位来存储,即分,按月的数据超过了两百多万,即超过了int表示的正数的最大值。
鉴于java里数字类型按照补码来区分正负,按照二进制来讲,第一位是标志位,超过这个数就会从负数开始算,这是二进制中补码的时钟理论,具体可以看一下文章,里面有讲解。
int 类型最大值(按照无符号计算)
2^32-1=4,294,967,295,十位,对半算的话就是 2147483647
long 类型最大值(按照无符号计算)
2^64-1=18,446,744,073,709,551,615,二十位,对半算的话就是 9223372036854775807,一般的日常金额不会达到这个量级。
用于金额四则运算非除法的话最好还是用 long 来处理,这样就不用浮点相关的处理以及类型溢出的情况发生。