Chinaunix首页 | 论坛 | 博客
  • 博客访问: 442316
  • 博文数量: 1496
  • 博客积分: 79800
  • 博客等级: 大将
  • 技术积分: 9940
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 13:22
文章分类

全部博文(1496)

文章存档

2011年(1)

2008年(1495)

我的朋友

分类:

2008-09-09 17:23:57

    1. 代码

2.中数字类型的转换法则

    test1中看似除数中的所有的因子都被约掉了,只剩下了1000。但实际的输出却是5,而不是我们期望的1000。究其原因,是因为MICROS_PER_DAY按int类型进行的计算,而计算的结果是86400000000,已经超出了int类型的最大值,即溢出了(因int为32位,2^31-1=2147483647),24*60*60*1000*1000最后的结果是500654080(见程序中的print1的输出)。

 

    在产生了错误的计算结果后,该结果被付给了long型的MICROS_PER_DAY,long型为64位,故保持了这个错误的结果,最终导致了最终结果的错误。

 

    解决该问题的方法是,通过使用long常量来代替int常量作为每一个乘积的第一个因子,这样就可以强制表达式中所有的后续计算都使用long运算来完成,这样就不会丢失精度,即:

    long MICROS_PER_DAY = 24L*60*60*1000*1000;


    图中的六个实箭头表示了无信息损失的转换,而三个虚箭头表示的转换则可能丢失精度。

 

    3.浮点类型float, double的数据不适合在不容许舍入误差的金融计算领域。

    例如上面的test2,我们预期的得到的结果是0.1,但实际的输出却是0.8999999999999999。

 

    这种误差产生的原因是因为浮点数实际上是用二进制系统表示的。而分数1/10在二进制系统中没有精确的表示,其道理就如同在十进制系统中无法精确表示1/3一样。看完下面的第4点就可以明白其中的原因了。

 

    如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。

 

    4.既然说到了浮点型是使用二进制表示的,那么就再来复习以下这方面的内容。

 

[1]    

【责编:landy】

--------------------next---------------------

阅读(146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~