天天看点

Java金额计算的问题

1.包装类型比对

看代码

Java金额计算的问题

结果:

Java金额计算的问题

可以看到,两个包装类且值都是200的使用 == 的比较的结果都是false 其他都是true 接下来看下源码一探究竟 

Java金额计算的问题
Java金额计算的问题

通过Integer的源码可以发现当Integer的范围是 -128~127的时候是直接从缓存里面取的返回值,而超过以后是重新new一个对象返回,当然使用==的时候就会是false 而Integer 和 int比较的时候包装类会先转成int 再做比较,所以不会出现false的情况了,同时大家可以看到在编译阶段编辑器就提示了有问题。

2、多精度计算问题 

Java金额计算的问题

可以看到有两个计算出现了精度问题 Java中的简单浮点数类型float和double不能够精确运算。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降

开发中可以通过 BigDecimal 进行数值类型的计算。

数据库也是一样,mysql中有float和double类型,通过sql直接累加数据也会有精度缺失的情况。如果要精确的数值计算,要使用mysql的decimal类型 

3、除以0 

除以0其实在数学中是没有意义的,但是在java的日常开发中有些场景需要特别注意, 虽然这种场景不多,但还是需要特别注意下。 

(1)1除以0 

Java金额计算的问题

(2)0除以0 

Java金额计算的问题

原理是因为java的float和double使用了IEEE 754标准。这个标准规定:浮点数除以0等于正无穷或负无穷。

4、float转double 

Java金额计算的问题

原因是Float类中有一个doubleValue方法,返回值是一个double类型,这样会很容易的以为这是float转换double类型。但是转换之后精度缺失了。 

总结:所以在日常开发中一些不起眼的细节往往造就了各种奇奇怪怪的bug,这些细节时时刻刻在提醒着开发者们,注重基础知识的积累是有多么重要。 

​​​