zoukankan      html  css  js  c++  java
  • Effective Java 48 Avoid float and double if exact answers are required

    Reason

    The float and double types are particularly ill-suited for monetary calculations because it is impossible to represent 0.1 (or any other negative power of ten) as a float or double exactly.

       

    // This will print 0.6100000000000001

    System.out.println(1.03 - .42);

       

    // This will print 0.09999999999999998

    System.out.println(1.00 - 9 * .10);

       

    Right way

    Use BigDecimal , int , or long for monetary calculations

       

    public static void main(String[] args) {

    final BigDecimal TEN_CENTS = new BigDecimal( ".10");

    int itemsBought = 0;

    BigDecimal funds = new BigDecimal("1.00");

    for (BigDecimal price = TEN_CENTS; funds.compareTo(price) >= 0; price = price.add(TEN_CENTS)) {

    itemsBought++;

    funds = funds.subtract(price);

    }

    System.out.println(itemsBought + " items bought.");

    System.out.println("Money left over: $" + funds);

    }

       

    Advantage

    1. Precise
    2. Full control over Rounding(Able to select from eight rounding modes whenever an operation that entails rounding is performed)

    Disadvantage

    1. less convenient than using a primitive arithmetic type
    2. It's slower

       

    An alternative to using BigDecimal

    Using int or long, depending on the amounts involved, and to keep track of the decimal point yourself.

       

    public static void main(String[] args) {

    int itemsBought = 0;

    int funds = 100;

    for (int price = 10; funds >= price; price += 10) {

    itemsBought++;

    funds -= price;

    }

    System.out.println(itemsBought + " items bought.");

    System.out.println("Money left over: "+ funds + " cents");

    }

       

    Decision on choosing implementation

    Quantities

    9

    18

    >18

    Use

    int

    long

    BigDecimal

       

    Summary

    Don't use float or double for any calculations that require an exact answer. Use BigDecimal if you want the system to keep track of the decimal point and you don't mind the inconvenience and cost of not using a primitive type.

  • 相关阅读:
    利用快慢指针快速得到链表中间节点
    idea编译golang插件总结
    Jquery复习(二)之stop()易忘点
    Jquery复习(一)之animate()易忘点
    doT学习(三)之实战
    doT学习(二)之用法集合
    doT学习(一)之语法
    npm学习(十二)之高级用法
    npm学习(十一)之package-lock.json
    npm学习(十)之如何使用创建、发布、使用作用域包
  • 原文地址:https://www.cnblogs.com/haokaibo/p/avoid-float-and-double-if-exact-answers-are-required.html
Copyright © 2011-2022 走看看