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.

  • 相关阅读:
    innodb_fast_shutdown中值为1或者2的区别是?
    C语言解析日志,存储数据到伯克利DB 2
    (2010-8-31) awk内存泄漏以及缓慢的正则表达式计算速度
    C语言解析日志,存储数据到伯克利DB
    awk的接口实现方案1
    谷歌开源Gumbo:纯C语言实现的HTML5解析库
    pylint
    提高写代码的能力(转载)
    python的闭包以及闭包在设计里的意图和作用
    痛并快乐的造轮子之旅:awk访问数据库之旅
  • 原文地址:https://www.cnblogs.com/haokaibo/p/avoid-float-and-double-if-exact-answers-are-required.html
Copyright © 2011-2022 走看看