在Java开发过程中我们有时会遇到一些必要的运算,最重要的是一些项目是金融相关的项目对这些运算的精度要求非常高。为什么会出现精度丢失的情况呢?我们又该如何解决这种精度丢失的问题呢?
那就要我们从类型转换开始了。。
在类型转换中,整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
float a = 3.14;这个语句的意思是把双精度浮点类型(double)赋值给单精度浮点类型(float)的变量a,把一个高精度的数赋值给一个低精度的数,就会造成精度丢失了
转换是从低级到高级。
虚线的是类型转换会结果产生舍入误差。
问题原因:
因为计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。Float和Double提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了在后来的运算会出现不正确结果的情况。
自动转换的规则:字符可以自动提升为整数。小的类型自动转化为大的类型。特别是整数类型可以自动转化为浮点类型,但可能会产生舍入误差。
注意:
强制类型转换可能导致溢出或损失精度
在把容量大的类型转换为容量小的类型时必须使用强制类型转换
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
图上的BigDecimal方法可以解决精度丢失的问题。
Java在解决精度丢失的问题上提供了BigDecimal方法。
具体用法就是上图(假设传入和设置的值的类型均为Double);