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

来源:互联网 发布:校园网络自助服务系统 编辑:程序博客网 时间:2024/04/27 18:55
package expressionPuzzles;import java.math.BigDecimal;public class chargesPuzzle {/**物品一共是1.10美元,手里只有2美元,精确打印出找零值; * @param args */public static void main(String[] args) {// TODO Auto-generated method stubcharge();}private static void charge() {// TODO Auto-generated method stubSystem.out.println(2.00 - 0.10);//返回结果是1.9System.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的BigDecimalSystem.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));}}

有一个问题,为什么如果是0.1的话,结果就成功那?在下一篇中有解析。
原创粉丝点击