找零程序Java_JAVA解惑--找零时刻

请考虑下面这段话描述的问题:

有人在一家汽车配件商店购买了一个价值$1.10的火花塞,但是他只有两美元一张的钞票。如果他用一张两美元的钞票支付这个火花塞,那么应该找给他多少零钱呢?

下面是一个试图解决上述问题的程序,它会打印出什么呢?

public class Change{

public static void main(String args[]){

System.out.println(2.00-1.10);

}

}

你可能会很天真的期望该程序能够打印出0.90,但是它如何才能知道你要打印小数点后两位小数呢?

如果你对在Double.toString文档中所设定的将double类型的值转换为字符串的规则有所了解,你就会知道该程序打印出来的小数,足以将double类型的值与最靠近它的临界值区分出来的最短的小数,它在小数点之前和之后都至少有一位,因此看起来,该程序应该打印0.90是合理的。

这么分析可能显得很合理,但是并不正确。如果你运行该程序,你就会发现它打印的是0.8999999999999999。

问题在于1.1这个数字不能被准确的表示成为一个double,因此它被表示成为最接近它的double值。该程序就是从2中减去这个值。遗憾的是,这个计算的结果并不是最接近0.9的double值。表示结果的double值的最短表示就是你所看到的打印出来的那个数字。

更一般的说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示。

如果你使用的是JDK5.0或更新的版本,可以通过printf工具来设置输出精度的方法来修改     该程序:

Sys

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值