昨天在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的观点看待该问题,是程序员应该掌握规避方法,还是改变其内部处理机制?你如何看呢?