当前位置:编程学习 > C#/ASP.NET >>

求解C#中的圆整错误


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是无论如何都无法用二进制确切表示的啊。
求大侠解释。 --------------------编程问答-------------------- 这是IEEE754浮点数误差,不是什么圆整错误...这是计算机基础知识,也是这里的月经问题之一... --------------------编程问答--------------------

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++;
            }
        }
    }

如果使用预定义的静态方法,则没有出现该情况。说明该方法进行了特殊处理,也就是所谓的“圆整”,
只是因为按照书上做的时候代入了不同数字,出现了不同结果,很是好奇 --------------------编程问答-------------------- 还是和圆整没关系...只不过是不同类型转换时的规则不同而已,一个是无符号数一个是有符号数,类型都不一样,转换规则也不一样... --------------------编程问答-------------------- 这样么?第二个例子,将int改为uint;将short改为ushrot结果也是一样的
不过还是很感谢你回复我 --------------------编程问答--------------------
为了不表现的太不可理喻,我把文档原文截图过来,
因为这本书的声誉很好,所以我暂时相信它所叙述的内容,直到得到一个确切的理由
这里,再次感谢你的回复 --------------------编程问答--------------------
float f = 50.35f;
ushort us = BitConverter.ToUInt16(BitConverter.GetBytes(f), 0);


这种才跟计算机二进制存储方式有关系...

而浮点数转换为整型数仅仅是丢失精度,转换规则直接抛弃小数而已...至于浮点数与高精度类型转换decimal过程可能产生的误差也仅仅是浮点数存储本身造成的误差,和转换本身没有关系...

比如,这个...
float f = 50.35f;
double d = f;


尽信书不如无书... --------------------编程问答-------------------- 这么跟你说吧,浮点数从你存的那一刻起它的值就未必是你肉眼看到的那个值了...这种误差和转换是没有关系的...

至于怎么存储的,为什么会产生误差,你最好去看IEEE754文档...无理数是不可能完全表示的,存储精度都是有限的... --------------------编程问答--------------------
恩,那么,为什么这两种做法会产生不同的结果呢?
另外,无论如何,尽信书不如无书的教诲我会记得的
很晚了,休息,明天再请教 --------------------编程问答-------------------- 挖坟!!!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,