static void Main()
        {
            float value = 1.35f;
            while (value<11)
            {
                uint dollars = (uint)value;
                ushort cents = (ushort)((value - dollars) * 100);
                Console.WriteLine(cents.ToString());
                value++;
            }
        }代码改自C#高级编程关于类型转换的例子,例子采用数字50.35来说明圆整错误
但是,按照上面的代码看,圆整错误并不总是发生,而且和小数部分没有必然的
关系,这是和float数据的存储格式有什么关联吗?如果仅仅是考虑十进制转换
为二进制的话,小数部分的0.35是无论如何都无法用二进制确切表示的啊。
求大侠解释。

解决方案 »

  1.   

    这是IEEE754浮点数误差,不是什么圆整错误...这是计算机基础知识,也是这里的月经问题之一...
      

  2.   


    class NumTest
        {
            static void Main()
            {
                float value = 1.35f;
                while (value<11)
                {
                    int dollars = (int)value;
                    short cents = Convert.ToSByte(((value - dollars) * 100));
                    Console.WriteLine(cents.ToString());
                    value++;
                }
            }
        }如果使用预定义的静态方法,则没有出现该情况。说明该方法进行了特殊处理,也就是所谓的“圆整”,
    只是因为按照书上做的时候代入了不同数字,出现了不同结果,很是好奇
      

  3.   

    这样么?第二个例子,将int改为uint;将short改为ushrot结果也是一样的
    不过还是很感谢你回复我
      

  4.   

    float f = 50.35f;
    ushort us = BitConverter.ToUInt16(BitConverter.GetBytes(f), 0);
    这种才跟计算机二进制存储方式有关系...而浮点数转换为整型数仅仅是丢失精度,转换规则直接抛弃小数而已...至于浮点数与高精度类型转换decimal过程可能产生的误差也仅仅是浮点数存储本身造成的误差,和转换本身没有关系...比如,这个...
    float f = 50.35f;
    double d = f;尽信书不如无书...
      

  5.   

    这么跟你说吧,浮点数从你存的那一刻起它的值就未必是你肉眼看到的那个值了...这种误差和转换是没有关系的...至于怎么存储的,为什么会产生误差,你最好去看IEEE754文档...无理数是不可能完全表示的,存储精度都是有限的...