谜题2:找零时刻

以下代码表示用2元,支付1元1角的费用,返回找零结果,什么地方有问题?

public class Change {
    public static void main(String[] args) {
        System.out.println(2.00 - 1.10);
}

分析
浮点数在计算机以IEEE754表示,有些数字不能以有限位精确表示,例如1.10

改进
转换为整型表示(int,long)或者使用BigDecimal

public class Change {
    public static void main(String[] args) {
        System.out.println((200 - 110) + "cents");
        System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
}

注意

  1. 传入BigDecimal的参数以字符串形式表示,以浮点数形式传入仍然会以IEEE754形式显示;
  2. BigDecimal并没有重载运算符(+,-,*,/)等,需要调用相应的API(add,subtract等);
  3. BigDecimal比Java原生的浮点数运算要缓慢很多,与SQL中的DECIMAL类型对应;

小结

  1. 浮点数存在精确表示问题,使用整型(int,long)或者BigDecimal表示;

引用

  1. Java Puzzlers : Traps, Pitfalls, and Corner Cases
posted @ 2021-03-13 23:47  蒋智  阅读(52)  评论(0)    收藏  举报