BigDecimal-精确表示货币值1

问题描述:

假设你身上有1元钱,货架上有一排美味的糖果,标价分别为0.1元,0.2元,0.3元...直到1元.

你打算从标价为0.1元的糖果开始,每种糖果购买一颗,一直到不能支付下一种价格的糖果为止,那么你可以购买多少颗糖果?
还会剩下多少零钱?

输出结果应该为4颗,还剩0元.请用程序实现.

import java.util.*;
import java.math.BigDecimal;
class BuyTangGuo_BigDecimal
{
	public static void main(String[] args){		
		final BigDecimal TEN_CENTS = new BigDecimal("0.1");//使用String作为参数的那个构造器,new BigDecimal(0.1)不是想要的结果
		BigDecimal funds = new BigDecimal("1");				
		int itemsBought = 0;
		for(BigDecimal price = TEN_CENTS;funds.compareTo(price)>=0;price = price.add(TEN_CENTS)){
			funds = funds.subtract(price);
			itemsBought++;
			System.out.println(price);
			System.out.println(funds);
			System.out.println("=========================");
		}
		System.out.println(itemsBought);
	}	
}

import java.util.*;
class BuyTangGuo_int
{
	public static void main(String[] args){
		
		int found =10;
		int itemsBought = 0;
		for(int price = 1;found >= price;price += 1){
			found = found - price;
			itemsBought++;
			System.out.println(price);
			System.out.println(found);
			System.out.println("---------------------");
		}
		System.out.println("买到 "+itemsBought+" 颗糖果,还剩 "+found+" 角.");
	}
}

第二种做法只是将原本需要double或者float的地方转变成int,属于思路转变;如果确实需要精确到小数,那么建议用BigDecimal表示货币值,并且使用String参数的构造器.

补充:

import java.util.*;
import java.math.BigDecimal;
class BigDecimalVSdouble
{
	public static void main(String[] args){		
		final BigDecimal a = new BigDecimal("0.10");//使用String作为参数的那个构造器,new BigDecimal(0.1)不是想要的结果
		BigDecimal funds = new BigDecimal("1");
		double x = 1.00;
		double y = 0.10;
		System.out.println(x-8*y);
		System.out.println(funds.subtract(a.multiply(new BigDecimal("8"))));
	}	
}

BigDecimal.setScale()方法用于格式化小数:
setScale(1)表示保留一位小数,默认用四舍五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)直接进位处理,如2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,如2.35变成2.4,5向上进
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,5向下舍
 
 
注释:
1)
scale指的是你小数点后的位数。比如123.456则score就是3.
score()就是BigDecimal类中的方法啊。
比如:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.
2)
roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3)
pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
求一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留scale个小数位,roundingMode表示的保留模式是什么,是四舍五入啊还是其它的。

4)对于一般add、subtract、multiply方法的小数位格式化如下:

BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("mData=" + mData);
----结果:----- mData=9.66

猜你喜欢

转载自blog.csdn.net/zpcandzhj/article/details/75804030