JAVA的货币计算

2019-12-10  本文已影响0人  as_pixar

我们去超市买糖果,口袋里有1块钱,货柜上的糖果有 1角钱,2角钱,3角钱,等等,每个都想买一颗回家吃,接下来我们写一个买糖果的程序


package com.as.improve;
import java.math.BigDecimal;

/**
 * 购买糖果的货币计算
 * 
 * @author as_pixar
 */
public class BuySweetsForCurrency{

    public static void main(String[] args) {
        // float double 比较精确类型,不能用于货币计算
        // BigDecimal 精确类型,用于货币计算,速度有点慢,写法上也有些麻烦,速度可以忽略。
        System.out.println(1.03 - 0.42); // 0.61 != 0.6100000000000001 错误结果
        System.out.println(1.00 - 9 * 0.10); // 0.1 != 0.09999999999999998 错误结果

        buyGoods1();

        buyGoods2();

        buyGoods3();
    }

    // 错误购买四颗糖 1
    private static void buyGoods1() {
        int itemsBought = 0; // 可以买几块糖果
        double funds = 1.00; // 总共有1元
        double price = 0.10;// 第一块糖果1角钱
        for (; funds > price; price += 0.10) {
            funds -= price;
            itemsBought++;
        }
        String result = "买" + itemsBought + "块糖果,还剩零钱¥" + funds;
        System.out.println(result);
    }

    // 正确购买四颗糖  2
    private static void buyGoods2() {
        int itemsBought = 0; // 可以买几块糖果
        BigDecimal funds = new BigDecimal("1.00"); // 总共有1元
        BigDecimal TEN_CENTS = new BigDecimal("0.10"); // 第一块糖果1角钱
        for (BigDecimal price = TEN_CENTS; funds.compareTo(price) >= 0; price = price.add(TEN_CENTS)) {
            itemsBought++;
            funds = funds.subtract(price); // 每买一块糖果还剩多少钱
        }
        String result = "买" + itemsBought + "块糖果,还剩零钱¥" + funds;
        System.out.println(result);
    }

    // 正确购买四颗糖  3
    private static void buyGoods3() {
        int itemsBought = 0;
        int funds = 100;
        for (int price = 10; funds >= price; price += 10) {
            funds -= price;
            itemsBought++;
        }

        String result = "买" + itemsBought + "块糖果,还剩零钱¥" + funds;
        System.out.println(result);
    }

}

输出结果
0.6100000000000001
0.09999999999999998
买3块糖果,还剩零钱¥0.3999999999999999
买4块糖果,还剩零钱¥0.00
买4块糖果,还剩零钱¥0

项目地址 https://github.com/githubwwj/ImproveJava

上一篇下一篇

猜你喜欢

热点阅读