日期:2014-05-19  浏览次数:21105 次

是我理解的不正确,还是.net系统有秘密?
我的开发环境:VS2005,使用语言:C#

碰上这样的2个问题,着时头痛,大家看看。

问题一:
float   a   =   0.05;(此处数据来源于数据库,并非直接赋值,下面的基本程序中就是这样写的)
double   b   =   0.0;
b   =   a;

此时监视b的值等于0.05000000000000007329434;记得不是太清楚,总之大于0.05,中间有一大堆的0。

问题二:
在调试web程序时,调试中途停止调试,结果发现后面的代码被执行了,此问题我特意重新复现了不下10次。我调试的代码是往数据库中写入一个数据,调试到还没有执行写入命令时,中断调试。此时去查看数据库,结果数据库中的数据已经改变成我调试时的数据。

非常之郁闷。


------解决方案--------------------
1、float a = 0.05f;
double b;
b = a;
刚刚研究了下楼主提出的问题,印b的值会不等于0.05,而变成0.0500000007450581;这是由于从单精度的float到双精度的double隐式数值转换出现的精度变化;之所以出现这样的奇怪答案,是因为 float 和 double 不能精确的表达 0.1 ,或者任何 10 的负 n 次方。他们是设计来进行科学和工程上的计算,提供精确的近似值的。
楼主可以试下0.04f,0.03f等数值,就会出现0.0399999991059303等数值。(四舍五入)

以上是个人见解,楼下继续...
------解决方案--------------------
web程序,不是winform程序,客服端提交给了服务器端来处理,如果不抛出异常的话,绝对会一直执行下去的。不管是DEBUG还是正式发布了以后,原理是一样的。就象你提交一个表单,网速慢的情况下,你提交完毕以后,页面变成白的,把页面关闭,这样是不能阻止服务器端响应的。

大家如果不相信的话,可以做个试验,在DEBUG模式下,调试WEB程序,中途中断,是不会影响下面的执行的