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

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的话,结果就成功那?在下一篇中有解析。

你可能感兴趣的:(《java,解惑》学习笔记,float,string,class)