您的位置:首页 > 其它

表达式之谜2找零时刻(需要精确答案的地方,避免使用float和double;货币运算使用int,long或BigDecimal)

2011-12-01 17:16 507 查看
package expressionPuzzles;

import java.math.BigDecimal;

public class chargesPuzzle {

/**物品一共是1.10美元,手里只有2美元,精确打印出找零值;
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
charge();
}

private static void charge() {
// TODO Auto-generated method stub
System.out.println(2.00 - 0.10);//返回结果是1.9
System.out.println(2.00 - 1.10);//返回结果是0.8999999999999999
/*从结果可知,并没有得到想要的结果0.90.
原因是1.1这个数字不能被精确表示为一个double,而是被表示为最接近它的double值,从而参与运算的是最接近的double值,而非1.1。
一般的,并不是所有的小数都可以用二进制浮点数精确表示。
浮点运算在一个范围很广的值域上提供了很好的近似,但通常不能产生精确的结果。*/

//改进为:一定要用BigDecimal(String)构造器,
//而千万不要用BigDecimal(double)。后一个构造器将用它的参数的“精确”值来创建一个实例:
//new BigDecimal(.1)将返回一个表示
//0.100000000000000055511151231257827021181583404541015625的BigDecimal
System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));

}

}


有一个问题,为什么如果是0.1的话,结果就成功那?在下一篇中有解析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: