java对于浮点运算的bug
许可:
/**
* 最近接到客服反映后台经常有一些退款总是退不干净,
* 比如550.1元的交易,小二退款时输入了550.10最终
* 却只退掉550.09
* 通过排查这个问题发现一个java中处理浮点运算的bug
* 这个bug,编程思想中也提到过.
* 问题说明和解决办法如下,也希望不知道的同学谨记
* 心,知道的同学请无视.
* */
/**
* java的基本类型数学运算普遍存在精度问题
* 比如我们想做一个简单的乘法运算 2.1*100
* 期望得到的是210
* 直接使用数字进行运算得到的是正确的
* 但是如果用float进行运算得到的就不是我们所预期的.
* 具体参看下面实例
* */
System.out.println( 2.1 * 100 );//210.0
float f = 2.1f;
int i = 100;
System.out.println( f * i );//209.99998
System.out.println( f * 100 );//209.99998
/**
* 解决办法使用BigDecimal
* BigDecimal类使它的用户对舍入行为有完全的控制权,
* 迫使用户显式地指定能够舍弃部分精度的舍入操作的舍入行为。
* 具体参看下面实例
* */
BigDecimal money = new BigDecimal("2.1");
BigDecimal oneHundred = new BigDecimal("100");
System.out.println(money.multiply(oneHundred)); //210.0
/**
* 结论,在java中对浮点进行一些运算的时候尽量使用BigDecimal来处理.
* */
回答一:有本教科书写道:货币计算切勿用小数,一般都用最小金钱分为单位了;
回答二:一般是换算成分,封装一个money类来做处理.用那个BigDecimal性能貌似不太好.