Java金额计算的问题
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
来源 | urlify.cn/iEZBja
简介:金额计算在一些支付类项目和电商项目中十分常见,很多开发在日常的写代码中时长会使用加减乘除等计算,但是有一些新手同学一旦使用错了方式,往往会挨上领导的批评,这次就来看下金额计算中的几个注意点
1.包装类型比对
看代码
结果:
可以看到,两个包装类且值都是200的使用 == 的比较的结果都是false 其他都是true 接下来看下源码一探究竟
通过Integer的源码可以发现当Integer的范围是 -128~127的时候是直接从缓存里面取的返回值,而超过以后是重新new一个对象返回,当然使用==的时候就会是false 而Integer 和 int比较的时候包装类会先转成int 再做比较,所以不会出现false的情况了,同时大家可以看到在编译阶段编辑器就提示了有问题。
2、多精度计算问题
可以看到有两个计算出现了精度问题 Java中的简单浮点数类型float和double不能够精确运算。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降
开发中可以通过 BigDecimal 进行数值类型的计算。
数据库也是一样,mysql中有float和double类型,通过sql直接累加数据也会有精度缺失的情况。如果要精确的数值计算,要使用mysql的decimal类型
3、除以0
除以0其实在数学中是没有意义的,但是在java的日常开发中有些场景需要特别注意, 虽然这种场景不多,但还是需要特别注意下。
(1)1除以0
(2)0除以0
原理是因为java的float和double使用了IEEE 754标准。这个标准规定:浮点数除以0等于正无穷或负无穷。
4、float转double
原因是Float类中有一个doubleValue方法,返回值是一个double类型,这样会很容易的以为这是float转换double类型。但是转换之后精度缺失了。
总结:所以在日常开发中一些不起眼的细节往往造就了各种奇奇怪怪的bug,这些细节时时刻刻在提醒着开发者们,注重基础知识的积累是有多么重要。