加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java 中任意两个int 型相除,结果为零~ 碉堡了

(2012-07-18 11:45:36)
标签:

it

分类: JAVA

做一个300 / 1700 的算数题,结果为0

 

解决办法: 

new BigDecimal(300).divide(new BigDecimal(1700));

-------------------------------------------------------------------

数据的值,远超于int long double的表示范围了。
要用BigInteger 和BigDecimal这些大数据类型

-------------------------------------------------------------------

这样写才能对,BigDecimal 有很多方法

http://s6/middle/4e1e357dgc5128eb02515&690中任意两个int 型相除,结果为零~ 碉堡了" TITLE="java 中任意两个int 型相除,结果为零~ 碉堡了" />

 

还是基础不行哇,这个应该和计算机编译器啥的有关吧。。。

 

转int 型:

 

BigDecimal a=new BigDecimal(12.88);
    int b=a.intValue();
    System.out.println(b);//b=12;

 

空大师 碉 啊

--------------------------------------------------------

13.2.17 补充:

转自:http://blog.csdn.net/love_world_/article/details/8478879

一  问题描述

    float和double类型不能用于精确计算,其主要目的是为了科学计算和工程计算,它们执行二进制浮点原酸,目的是为了广泛的数值范围上提供较为精确的快速近似计算而精心设计的。但是如果设计钱币之类的计算需要很精确,所以这种情况不能使用float和double,因为要让其精确表示0.1 或者 10的任何负数次方值是不可能的。


二 眼见为实,举例证明:

 

  1. // float与double 无法精确表示0.1 或者 10的负次方  
  2. System.out.println( 0.15 0.05 ); // 0.09999999999999999  
  3. System.out.println( 2.08f 3.7f );// -1.6200001  


 

三 举一个现实中会遇到的情况:

     一个实际的例子,口袋里面有10元钱,买0.9元的商品十个 , 收银员需要找零1元。计算如下:

 

  1. 10 0.9 10 1  
     代码实现:

 

 

  1. float myMoney 10.00f;  
  2. float price 0.9f;  
  3. for (int 010i++)  
  4.     myMoney -= price;  
  5.  
  6. System.out.println( myMoney ); // 1.0000002  

    结果竟然输出的是1.0000002而非1,可能很多人会认为这也无所谓啊,毕竟仅偏差了0.0000002,但问题是如果前提是进行了1亿笔交易呢?难道你愿意仅仅因为使用了计算机计算这些数据,而损失一部分钱吗?

 



四 解决办法

1. 使用int 和 long类型,如果小数点以后的值可以忽略不计可以只用这两种类型

2. 对计算结果进行四舍五入

3. 使用BigDecimal类型进行浮点运算


先来看一段代码

 

  1. int intValue 10 
  2. float floatValue 0.99999f;  
  3.   
  4. int count1 (int(intValue floatValue);  
  5. System.out.println("10 0.99999 "  count1); // output 10  
  6.   
  7. int count2 (int(intValue floatValue);  
  8. System.out.println("10 0.99999 "  count2); // output 9  

原本按我个人的理解 10 + 0.99999 = 10.99999 然后转为int类型会进行四舍五入 值为11,而实际结果为10

 



更深入的分析可以查看


如何解决float和double误差问题呢?可以使用Java中提供的java.math.BigDecimal,不过此类型是不可变的,每次计算都必须新创建一个对象,不适合大量计算


再来看一个舍入误差会出现的问题

 

  1.               // 10.1 0.99*10 20  
  2. float f1 10.1f;  
  3. float f2 0.99f;  
  4. for (int 010i++)  
  5.     f1 += f2;  
  6.  
  7. System.out.println(f1); // 19.999998  

解决办法,使用BigDecimal

 


 

  1. BigDecimal count new BigDecimal("10.1");  
  2. for (int 010i++)  
  3.     count count.add(new BigDecimal("1"));  
  4.  
  5.   
  6. System.out.println(count.intValue()); // 20  


 




参考资料:

1. Java 理论与实践: 您的小数点到哪里去了?

2. 《Effective Java》 第2版 第48条 如果需要精确的答案,请避免使用float和double

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有