漂泊的年华
北飘一族
posts - 5,comments - 0,trackbacks - 0

 Bill.Gate在一家小超级市场购买一个1.10元棒棒糖,但是他的钱报中都是两块一张的钞票.如果他用一张两块的钞票买这个棒棒糖,那么应该找给他多少零钱呢?
     编写一个程序解决这个问题.
code:
class Change
{
 public static void main(String[] args)
 {
  System.out.println(2.00-1.10);
 }
}

       Bill.Gate写下这段代码我们期望得到应该找回的零钞0.90,但是当运行后他发现数据不兑,运行结果为:0.8999999999999999,与预期的0.90不一样。为什么呢?搞了半天原因在于1.1这个数不能被精确的表示为一个double,因此被表示为最接近它的double值.该程序从2中减去这个值得.遗憾的是,这个结果打印出来并不是接近0.9的double值.这说明: 并不是所有的小数都可以用二进制浮点数精确表示.二进制浮点对于货币计算是非常不适合的.
      要解决这个问题有两个办法:一是使用某种整数类型,例如int或long,并且分单位来计算.如下:
System.out.println((200-110)+"fen");
结果为90分.二是使用执行小数运算的BigDecimal.它还可以通过JDBC与SQL DECIMAL类型进行互操作.这里需要注意的是: 一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double).后一个构造器将用它的参数值来创建一个实例.例如new BigDecimal(.1),它将返回一个BigDecimal,也即0.10000000000000000555111512312578270211815834041015625.正确使用我们就可以得到期望的结果0.90:
code:
import java.math.BigDecimal;
class Change
{
 public static void main(String[] args)
 {
  System.out.println(new BigDecimal("2.00").
                     subtract(new BigDecimal("1.10")));
 }
}
Print:
F:\Java Develop>java Change
0.90

posted on 2007-01-10 14:17 迪蓝 阅读(135) 评论(0)  编辑  收藏 所属分类: puzzled

只有注册用户登录后才能发表评论。


网站导航: