<pre class="html" name="code">
浮点数做差时结果无法预测,那么在银行或其他金融系统中这种情况就应该避免,详情代码如下:
public class Test1 {
public static void main(String[] args) {
{
float a = 1.1f;
float b = 0.1f;
System.out.println(a-b);
}
{
float a = 2.1f;
float b = 0.1f;
System.out.println(a-b);
}
}
}
输出结果为:
1.0
1.999999999
为什么第二个输出结果不对呢?
经过查找原因我得到以下结果:
十进制小数转为二进制数的时候有些是不能用二进制数表示的,因为二进制来表示是无限循环的,计算机是作为二进制数来运算的,当两个数用二进制来表示都是无限循环的时候做差,那么结果是无法预测的。十进制小数表示成二制数是小数部分乘2取整,例如0.1计算方法是0.1*2=0.2取整为0,然后0.2*2=0.4取整为0,0.4*2=0.8取整为0,0.8*2=1.6取整为1,0.6*2=1.2取整为1,0.2*2=0.4取整为0,开始重复之前的步骤,0.1=0001100110011……。同理十进制无法用三进制来表示,例如1/3=0.333333333 ……。
下面给出解决方法代码:
public class Test1 {
public static void main(String[] args) {
{
float a = 2.1f;
float b = 0.1f;
System.out.println(a-b);
}
{
BigDecimal a = new BigDecimal(2.1+"");
BigDecimal b = new BigDecimal(0.1+"");
BigDecimal c = a.subtract(b);
System.out.println(c.doubleValue());
}
}
}
详情方法说明可见api。