1.1 + 1.55 + 0.35==3 为false 不信你试 本帖最后由 caiyue1 于 2010-07-21 16:01:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Console.WriteLine((Int32)(1.1 + 1.55 + 0.35) == 3); //true Console.WriteLine((Int32)(2.1 + 1.55 + 0.35) == 4); //true double a1 = 1.1 + 1.55 + 0.35; double b1 = 3.0; bool c1=(a1 == b1); double a2 = 2.1 + 1.55 + 0.35; double b2 = 4.0; bool c2 = (a2 == b2);//不打开vs请指出c1,c2的值 . 4.3.3 浮点变量与零值比较【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。假设浮点变量的名字为 x,应当将if (x == 0.0) // 隐含错误的比较转化为if ((x>=-EPSINON) && (x<=EPSINON))其中EPSINON 是允许的误差(即精度)。摘自《高质量C++编程指南》 Javascript 一般都会这么写!alert(parseInt(1.1 + 1.55 + 0.35,10)) 真的受教了,以后设计精度的比较一定得用个>=或<= 来比较了。要不还真难理解哈。 有bug啊新的bug啊新的千年虫要来了代号 2012 知道看到这位的答案 我才恍然大悟。前面那些数加起来 其实是double.falot 但是 你去跟INT型的3比较 当然是不正确的。 昨天就遇到了浮点数的问题,dll是vc做的,程序是delphi做的,传递129.70,接收后*100变成了12969,最后我加了个ceil float, int 类新不一样,当然是有差别的啦。哈哈 一个是单精度float,一个是双精度double 浮点比较要允许一定的误差if(Math.Abs(1.1 + 1.55 + 0.35 - 3)<0.000001){ MessageBox.Show("1.1+1.55+0.35==3");}else{ MessageBox.Show("1.1+1.55+0.35!=3");} 前提是自己要搞清楚,或者遇到问题后屈尊看看msdn之类的,“那是四舍五入吗?”。 如果你看msdn,可以看到单独作为一个标题的描述:此方法的行为遵循 IEEE 标准 754 的第 4 节。这种舍入有时称为就近舍入或银行家舍入。 这个问题提的很有意义。下面的这段是我在其他网站上看到的:老实说在今天之前,我对javascript的浮点数运算毫无认识,觉得应该和实际运算中一样,然而,有些事情往往会出人意料。先看一组数据:0.1 + 0.11 = 0.210000000000000020.2 * 3 = 0.60000000000000010.7 / 10 = 0.06999999999999999你相信吗?如果不信,那么立即打开firefox浏览器测试吧。有一点可以确信,你看到测试结果的表情,一定先是惊讶,后来是迷惑。这里有几个demo,再来看看出现浮点数运算bug的概率,猛击之:加法、乘法、除法对于这样的结果,我不知道是怎么产生的,但是既然是bug,就一定是可以hack的,思路很简单,先把所有的运算数转成int型(表达不准 确,javascript的没有int、float之分),计算出两个运算数的小数点后的位数,再进行适当的运算,就可以得到原始的我们期望看到的结果 了。代码如下:加法运算:1.function add(num1,num2){2. var reg = /\./i;3. if(!reg.test(num1) && !reg.test(num2)){4. return num1 * num2;5. }6. var r1 = 0, r2 = 0, m;7. var str1 = num1.toString(), str2 = num2.toString();8. if(str1.indexOf('.')>-1){9. r1 = str1.split('.')[1].length;10. }11. if(str2.indexOf('.')>-1){12. r2 = str2.split('.')[1].length;13. }14. m = Math.pow(10,Math.max(r1,r2));15. return (mul(num1,m) + mul(num2,m)) / m;16.}乘法运算:1.function mul(num1,num2){2. var reg = /\./i;3. if(!reg.test(num1) && !reg.test(num2)){4. return num1 * num2;5. }6. var len = 0, str1 = num1.toString(), str2 = num2.toString();7. if(str1.indexOf('.')>=0){8. len += str1.split('.')[1].length;9. }10. if(str2.indexOf('.')>=0){11. len += str2.split('.')[1].length;12. }13. return Number(str1.replace('.','')) * Number(str2.replace('.','')) / Math.pow(10,len);14.}除法运算:1.function div(num1,num2){2. var reg = /\./i;3. if(!reg.test(num1) && !reg.test(num2)){4. return num1 * num2;5. }6. var len1 = 0, len2 = 0;7. var str1 = num1.toString(), str2 = num2.toString();8. //计算位数差9. if(str1.indexOf('.')>-1){10. len1 = str1.split('.')[1].length;11. }12. if(str2.indexOf('.')>-1){13. len2 = str2.split('.')[1].length;14. }15. return mul(Number(str1.replace('.','')) / Number(str2.replace('.','')),Math.pow(10,len2-len1));16.} 0.6 + 0.6 = 1.2转换成Int打印出来就成了 1 + 1 = 1 就算我以为会等于true,但是一当运行起来,等于false,就应该马上明白,是精度问题。基础! hotmail使用HttpwebRequest 域不同cookie跳转问题? 关于IP的SQL查询语句应该怎么写。 统计一下大家用.net做C/S模式开发都用什么报表控件 无法解决的数据库问题! 关于remoting的问题 新手提问:Form间相互调用成员的问题 一个生成HTML文件的问题,,急!!!!! 多多指点、 StringFormat中 自动换行怎么实现? 一个关于winform中页面管理的问题! 100分 asp.net 对excel操作 调用调用WINDOWS打开方式界面
Console.WriteLine((Int32)(2.1 + 1.55 + 0.35) == 4); //true
double b1 = 3.0;
bool c1=(a1 == b1); double a2 = 2.1 + 1.55 + 0.35;
double b2 = 4.0;
bool c2 = (a2 == b2);
//不打开vs请指出c1,c2的值 .
【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要避免
将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
假设浮点变量的名字为 x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON 是允许的误差(即精度)。摘自《高质量C++编程指南》
要不还真难理解哈。
新的bug啊
新的千年虫要来了
代号 2012
if(Math.Abs(1.1 + 1.55 + 0.35 - 3)<0.000001)
{
MessageBox.Show("1.1+1.55+0.35==3");
}
else
{
MessageBox.Show("1.1+1.55+0.35!=3");}
前提是自己要搞清楚,或者遇到问题后屈尊看看msdn之类的,“那是四舍五入吗?”。
0.1 + 0.11 = 0.21000000000000002
0.2 * 3 = 0.6000000000000001
0.7 / 10 = 0.06999999999999999你相信吗?如果不信,那么立即打开firefox浏览器测试吧。有一点可以确信,你看到测试结果的表情,一定先是惊讶,后来是迷惑。这里有几个demo,再来看看出现浮点数运算bug的概率,猛击之:加法、乘法、除法对于这样的结果,我不知道是怎么产生的,但是既然是bug,就一定是可以hack的,思路很简单,先把所有的运算数转成int型(表达不准 确,javascript的没有int、float之分),计算出两个运算数的小数点后的位数,再进行适当的运算,就可以得到原始的我们期望看到的结果 了。代码如下:加法运算:1.function add(num1,num2){
2. var reg = /\./i;
3. if(!reg.test(num1) && !reg.test(num2)){
4. return num1 * num2;
5. }
6. var r1 = 0, r2 = 0, m;
7. var str1 = num1.toString(), str2 = num2.toString();
8. if(str1.indexOf('.')>-1){
9. r1 = str1.split('.')[1].length;
10. }
11. if(str2.indexOf('.')>-1){
12. r2 = str2.split('.')[1].length;
13. }
14. m = Math.pow(10,Math.max(r1,r2));
15. return (mul(num1,m) + mul(num2,m)) / m;
16.}
乘法运算:1.function mul(num1,num2){
2. var reg = /\./i;
3. if(!reg.test(num1) && !reg.test(num2)){
4. return num1 * num2;
5. }
6. var len = 0, str1 = num1.toString(), str2 = num2.toString();
7. if(str1.indexOf('.')>=0){
8. len += str1.split('.')[1].length;
9. }
10. if(str2.indexOf('.')>=0){
11. len += str2.split('.')[1].length;
12. }
13. return Number(str1.replace('.','')) * Number(str2.replace('.','')) / Math.pow(10,len);
14.}
除法运算:1.function div(num1,num2){
2. var reg = /\./i;
3. if(!reg.test(num1) && !reg.test(num2)){
4. return num1 * num2;
5. }
6. var len1 = 0, len2 = 0;
7. var str1 = num1.toString(), str2 = num2.toString();
8. //计算位数差
9. if(str1.indexOf('.')>-1){
10. len1 = str1.split('.')[1].length;
11. }
12. if(str2.indexOf('.')>-1){
13. len2 = str2.split('.')[1].length;
14. }
15. return mul(Number(str1.replace('.','')) / Number(str2.replace('.','')),Math.pow(10,len2-len1));
16.}
转换成Int打印出来就成了 1 + 1 = 1