在Java开发过程中我们有时会遇到一些有必要的运算,而一些项目尤其是金融相关的项目就对这些运算的精度要求较高。那么为什么会出现精度丢失这种情况,我们又该如何解决这种问题呢?
原因:首先计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。Float和Double提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了在后来的运算会出现不正确结果的情况。
解决办法:Java提供了BigDecimal方法。具体用法如下(假设传入和设置的值的类型均为Double):
import java.math.BigDecimal; public class Test{ public Test(){ } public static double multiply(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); BigDecimal b3 = b1.multiply(b2);//此处举例使用乘法(注意:必须使用一个新的BigDecimal来获得运算后的值) Double b4 = b3.doubleValue(); return b4;//可直接使用这个值,set、输出都可以(部分步骤可简化) } }