本帖最后由 caiyue1 于 2010-07-21 16:01:06 编辑

解决方案 »

  1.   

                Console.WriteLine((Int32)(1.1 + 1.55 + 0.35) == 3); //true
                Console.WriteLine((Int32)(2.1 + 1.55 + 0.35) == 4); //true
      

  2.   

                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的值 .
      

  3.   

    4.3.3 浮点变量与零值比较
    【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
    千万要留意,无论是float 还是double 类型的变量,都有精度限制。所以一定要避免
    将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。
    假设浮点变量的名字为 x,应当将
    if (x == 0.0) // 隐含错误的比较
    转化为
    if ((x>=-EPSINON) && (x<=EPSINON))
    其中EPSINON 是允许的误差(即精度)。摘自《高质量C++编程指南》
      

  4.   

    Javascript 一般都会这么写!alert(parseInt(1.1 + 1.55 + 0.35,10))
      

  5.   

    真的受教了,以后设计精度的比较一定得用个>=或<= 来比较了。
    要不还真难理解哈。
      

  6.   

    有bug啊
    新的bug啊
    新的千年虫要来了
    代号 2012
      

  7.   

    知道看到这位的答案 我才恍然大悟。前面那些数加起来 其实是double.falot 但是 你去跟INT型的3比较 当然是不正确的。
      

  8.   

    昨天就遇到了浮点数的问题,dll是vc做的,程序是delphi做的,传递129.70,接收后*100变成了12969,最后我加了个ceil
      

  9.   

    float, int 类新不一样,当然是有差别的啦。哈哈
      

  10.   

    一个是单精度float,一个是双精度double
      

  11.   

    浮点比较要允许一定的误差
    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");}
      

  12.   


    前提是自己要搞清楚,或者遇到问题后屈尊看看msdn之类的,“那是四舍五入吗?”。
      

  13.   

    如果你看msdn,可以看到单独作为一个标题的描述:此方法的行为遵循 IEEE 标准 754 的第 4 节。这种舍入有时称为就近舍入或银行家舍入。
      

  14.   

    这个问题提的很有意义。下面的这段是我在其他网站上看到的:老实说在今天之前,我对javascript的浮点数运算毫无认识,觉得应该和实际运算中一样,然而,有些事情往往会出人意料。先看一组数据:
    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.}
      

  15.   

    0.6 + 0.6 = 1.2
    转换成Int打印出来就成了 1 + 1 = 1
      

  16.   

    就算我以为会等于true,但是一当运行起来,等于false,就应该马上明白,是精度问题。基础!