问题描述:
假设你身上有1元钱,货架上有一排美味的糖果,标价分别为0.1元,0.2元,0.3元...直到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向上进
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");
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表示的保留模式是什么,是四舍五入啊还是其它的。
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);
System.out.println("mData=" + mData);
----结果:----- mData=9.66