表达式之谜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的话,结果就成功那?在下一篇中有解析。
相关文章推荐
- 第48条:如果需要精确的答案,请避免使用float和double
- 第48条:如果需要精确的答案,请避免使用float和double
- Java:Effective Java 学习笔记(第48条:如果需要精确的答案,请避免使用float和double)
- 第四十八条:如果需要精确的答案,请避免使用float和double
- 如果需要精确答案,请避免使用float和double
- 《effective java》48—如果需要精确的答案,请避免使用float和double
- 需要精确答案,避免使用float和double
- 精确运算避免使用float和double
- 如果要求精确的答案,请避免使用float和double
- 如果要求精确的答案,请避免使用float和double
- 31-如果要求精确的答案,请避免使用float和double
- 如果要求精确的答案,请避免使用float和double
- Effective Java读书笔记--如果想要知道精确的答案,就要避免使用double和float
- 精确运算避免使用float和double
- Effective Java(2nd Edition) Item 48 如果需要精确结果,请避免使用float与double(译文)
- java中不能使用float和double来表示货币等精确的值,而是用
- 对于double和float类型运算精度丢失,请使用BigDecimal
- Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入
- Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入