摘要:昨天在VB中碰到两个问题,其实以前就碰到并解决过:
(1)
dim ss as double
ss = 194268.02 – 194268
肉眼可以判断结果为0.02,而VB中计算的结果:ss = 0.199999999895226E-02
ss = 1.2 - 1 VB计算的结果为:0.2
(2)
dim ss as double
ss = 400*1000
在VB6中,报越界!!
ss = 400*100000没有异常
分析原因:1:内部二进制与10进制的转换导致Double运算精度问题
2:Int16* Int16VB6以为应该返回Int16,但结果>32767导致越界错误,因此ss=2+32766也会导致溢出,经证实确实如此
这算不算BUG呢?我认为是.
.NET中是否还存在类似问题呢?
经测试在.NET中问题2表面看来已经不存在,但是:
double ss; int firstInt = 2147483646; int secondInt = 2; ss = firstInt + secondInt; Console.WriteLine(ss);
结果:ss = -2147483648
CLR用int32作为缓冲区,但如果我们的运算结果超出该缓冲区的大小,一样会越界!!
.NET中问题(1)依然如故
这两个问题通过类型转换可以轻松解决,我疑惑的是:从OOP的观点看待该问题,是程序员应该掌握规避方法,还是改变其内部处理机制?你如何看呢?
...[
阅读全文]