分类:
2008-09-08 18:24:00
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]