---------------------------------------------------------------
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
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
f是一个小数位数为0的浮点数据,而5.1f*10是作为小数精度为1位的数据,所以转换的时候j的1那位被干掉了
UInt16 i = (UInt16)f; UInt16 j = (UInt16)(5.1f * 10);>> ((UInt16)5.1f * (UInt16)10)
你说呢
f是51.0而(5.1f*100)是50.999999046325684,是不同的。
1,先赋值给 f 再进行类型转换,
2,直接进行类型转换
不一样呢?是不是应该一样呢?
v192(人都是環境逼出來的,所以往死裏逼我吧) :你的说法不敢苟同,float 的精度都是一致的,怎么会有不同?那么在计算中千变万化的数据精度全都不一样?好像很夸张。还记得大学计算机原理课程么?一种浮点数表示方法定下来了,精度就是一定的了panda2fw2(我爱Monkey):你是说 f = 5.1f*10 = 51.0, 而去掉前面的(f=),剩下的 5.1f * 10 <> 51.0 ??
----------
说得对.就是这样的.
double d = 50.999999046325684;
f = (float)d;
i = (UInt16)d;
结果是 f = 51.0, i = 50
zju3020912063() 这种不学无术的人,最好不要信口开河,闭上嘴没人把你当哑巴卖了
UInt16 i = (UInt16)f;
UInt16 j = (UInt16)(5.1f * 10);
这2个式子的运算顺序,第一个先算f的值(因为在式子之前就计算了),而第2个先运行UInt16(就是转换)计算方法的课程里楼主一定读过,在有误差的计算中,计算顺序不同会影响最后的结果。(虽然从数学上看先算哪步都一样)
zju3020912063() 这种不学无术的人,最好不要信口开河,闭上嘴没人把你当哑巴卖了
-----------------------------------------------------------------
忍不住说一句做人要厚道
------------------------------------------------
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。
VB是进行四舍五入,你如果用Convert.ToUInt16()来转换,就没有问题了。
---------------------------------------------------------------
采用这种方法比较好:
j = Convert.ToUInt16(d);
文档中说得也比较清楚:
舍入为最接近的 16 位无符号整数。
float f = 5.1f * 10f;
然而把后半部分5.1f * 10f 放到 watch 中,“类型”一栏分明显示 double,而 double 到 float 在C#中是不允许隐式转换的
有一批数据是带小数的,为了节省空间(数据总量几个G),把它们 * 10 后转换为UInt16型(从4字节转到2字节,省了好几个G的硬盘空间呢)算来算去,结果小数点后的数字都没有了,呵呵,希望能给大家提个醒讨论到这里,也算比较透彻了,感谢大家参与
float operator *(float x, float y);
double operator *(double x, double y);
float * float 还是float,不是double,所以BUG不存在。
忍为住
也要说两句
主要是你脑子的bug,多看看书,这是cpu的问题,所有语言都会有。高!!!支持!!!!
楼主呀
不是我说呀。这是数据类型。你还是大学毕业的呢??真不知道你是学什么的?