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.

  • 相关阅读:
    python测试开发django-1.开始hello world!
    python基础--杂项
    Python基础----函数
    python介绍
    公共Webservice
    divmod(a,b)函数
    模块知识
    第三周作业 修改配置文件
    rsync在windows和linux同步数据的配置过程
    docker学习笔记
  • 原文地址:https://www.cnblogs.com/haokaibo/p/avoid-float-and-double-if-exact-answers-are-required.html
Copyright © 2011-2022 走看看