---------------------------------------------------------------
float f = 5.1f * 10;
UInt16 i = (UInt16)f;
UInt16 j = (UInt16)(5.1f * 10);
---------------------------------------------------------------
f = 51, 谁知道 i,j 分别等于几?i = 51
j = 50如何解释?为什么 i j 不相等?
----------------------------------------------------------------
C# .net 2003 / WinXP sp2

解决方案 »

  1.   

    浮点类型数据不能用=号进行运算,会有精度问题的。
    f是一个小数位数为0的浮点数据,而5.1f*10是作为小数精度为1位的数据,所以转换的时候j的1那位被干掉了
      

  2.   

    乘法分配率或许可以解决你这个问题         float f = 5.1f * 10;
    UInt16 i = (UInt16)f;  UInt16 j = (UInt16)(5.1f * 10);>> ((UInt16)5.1f * (UInt16)10)
    你说呢
      

  3.   

    v192(人都是環境逼出來的,所以往死裏逼我吧)说得对。
    f是51.0而(5.1f*100)是50.999999046325684,是不同的。
      

  4.   

    主要是你脑子的bug,多看看书,这是cpu的问题,所有语言都会有。
      

  5.   

    我就知道会有这样的说法,可是你们考虑没有,同样是(!!!同样的!!!)  5.1f * 10   ,为什么
     1,先赋值给 f 再进行类型转换,
     2,直接进行类型转换
    不一样呢?是不是应该一样呢?
    v192(人都是環境逼出來的,所以往死裏逼我吧) :你的说法不敢苟同,float 的精度都是一致的,怎么会有不同?那么在计算中千变万化的数据精度全都不一样?好像很夸张。还记得大学计算机原理课程么?一种浮点数表示方法定下来了,精度就是一定的了panda2fw2(我爱Monkey):你是说 f = 5.1f*10 = 51.0,    而去掉前面的(f=),剩下的 5.1f * 10 <> 51.0 ??
      

  6.   

    真的是很不可思议。估计是VS.Net有点问题。
      

  7.   

    UInt16 j = (UInt16)(Math.Round(5.1f * 10, 0) );
      

  8.   

    你是说 f = 5.1f*10 = 51.0,    而去掉前面的(f=),剩下的 5.1f * 10 <> 51.0 ??
    ----------
    说得对.就是这样的.
      

  9.   

    是不同的,你在赋值的时候进行了转换的,5.1f * 10 <> 51.0这个是成立的,你可以自己去试试。
      

  10.   

    自己弄明白了。解释如下(很强的哦)1, 5.1f * 10, 甚至5.1f * 10f ,其运算结果都是 double 型,就是说,两个float 相乘,得到一个double。证据:调试,watch窗口中加入5.1f * 10f ,类型显示“double”2,更强的是 double  (50.999999046325684)转换成 float 转换成 51.0,但如果转换成 int、UInt16,就会转换成 50,证据:
       double   d = 50.999999046325684;
       f = (float)d;
       i = (UInt16)d;
    结果是  f = 51.0, i = 50
      

  11.   

    还忍不住说一句
    zju3020912063() 这种不学无术的人,最好不要信口开河,闭上嘴没人把你当哑巴卖了
      

  12.   

    5.1f * 10 <> 51.0是正确的,可能5.1f*10=50.9999999906564。但是这并不是产生楼主所遇到的结果的原因,真正的原因在于:
    UInt16 i = (UInt16)f;
    UInt16 j = (UInt16)(5.1f * 10);
    这2个式子的运算顺序,第一个先算f的值(因为在式子之前就计算了),而第2个先运行UInt16(就是转换)计算方法的课程里楼主一定读过,在有误差的计算中,计算顺序不同会影响最后的结果。(虽然从数学上看先算哪步都一样)
      

  13.   

    多谢 syeerzy(快乐永远)参与,不过你的理论有错误,我不得不指出:(UInt16)(5.1f * 10) 是先计算(5.1f * 10),而(UInt16)中的括号只是表示强制类型转换(以前看C/C++说的,估计C#一样),不是优先级,况且,类型转换要对某一个东西转换,这个东西是什么?不可能是(5.1f * 10)中的一部分5.1f,只能是(5.1f * 10)整体的运算结果。
      

  14.   

    还忍不住说一句
    zju3020912063() 这种不学无术的人,最好不要信口开河,闭上嘴没人把你当哑巴卖了
    -----------------------------------------------------------------
    忍不住说一句做人要厚道
      

  15.   

    另外,上面的例子在多个环境测试,效果都是一样的
    ------------------------------------------------
    C# .NET 2003/WIN XP /Piii 850 笔记本CPU
    非托管MFC (VS.NET 2003) /WIN XP/Piii 850 笔记本CPU
    VC6.0/WIN XP / C4 台式机
    Turbo C 2.0/WIN XP /C4 台式机
    ------------------------------------------------
    但这些环境中也不完全一样 !!!
    (int)(5.1f*10)在C#中结果为50(用watch看的)
    而同样的表达式在 Turbo C 2.0 中的结果为51。
      

  16.   

    我找到原因了,因为这个是显示转换,在不同的语言有不同的规定,C#规定是将小数点右边的值丢弃,
    VB是进行四舍五入,你如果用Convert.ToUInt16()来转换,就没有问题了。
      

  17.   

    嘿嘿,有人无端对我人身攻击,难免让我有点不厚道,不好意思 :)
    ---------------------------------------------------------------
    采用这种方法比较好:
    j = Convert.ToUInt16(d);
    文档中说得也比较清楚:
    舍入为最接近的 16 位无符号整数。
      

  18.   

    刚刚在VB.Net中测试,没有错,MSDN中说的是对的。在VB.Net中显示转换是51.0,没有问题的,看来不是C#的BUG,只是C#就是这么规定的,为了避免这种事情发生,还是尽量少用这种精度会损失的显示转换。
      

  19.   

    这样说来,前面的问题就不是真正的 Bug 了,而是我们对语言的理解不够(虽然规定有点不合理:50.99999999 转换成 float 变 51,而转换成 int 变 50,这即使不算 bug,也是设计上的缺陷吧)这样又引出一个真正的 bug:如前面所述,两个 float 相乘 结果是一个 double,但这样一个语句在 C#中编译却能通过
    float f = 5.1f * 10f;
    然而把后半部分5.1f * 10f 放到 watch 中,“类型”一栏分明显示 double,而 double 到 float 在C#中是不允许隐式转换的
      

  20.   

    讨论这么无聊的问题,其实是因为在实际应用中遇到了问题:
    有一批数据是带小数的,为了节省空间(数据总量几个G),把它们 * 10 后转换为UInt16型(从4字节转到2字节,省了好几个G的硬盘空间呢)算来算去,结果小数点后的数字都没有了,呵呵,希望能给大家提个醒讨论到这里,也算比较透彻了,感谢大家参与
      

  21.   

    还是来再说一句,你又错了,我在MSDN中查了,
    float operator *(float x, float y);
    double operator *(double x, double y);
    float * float 还是float,不是double,所以BUG不存在。
      

  22.   

    主要是你脑子的bug,多看看书,这是cpu的问题,所有语言都会有。高!!!
      

  23.   

    虽已结
    忍为住
    也要说两句
    主要是你脑子的bug,多看看书,这是cpu的问题,所有语言都会有。高!!!支持!!!!
    楼主呀
    不是我说呀。这是数据类型。你还是大学毕业的呢??真不知道你是学什么的?