5.02 X 100 = 501 ???

fycom200 2010-09-13 04:11:30
VC 中浮点变量 a=5.02 (float)
a X 100 的结果 为什么是 501 而不是想象中的 502? KEIL C 好像不是这样的
...全文
328 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
野鬼灬 2010-09-13
  • 打赏
  • 举报
回复
O,原来是这样~看来警告信息不能随便忽略哟
Simao 2010-09-13
  • 打赏
  • 举报
回复
这应该是数据类型的计算不统一造成的。。。
yujunnb 2010-09-13
  • 打赏
  • 举报
回复
没注意过这样的情况,应该是浮点型强制转换造成的,可以从计算机的精度方面着手
fycom200 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zeming_gu 的回复:]
因此501.99999809265转成float就成了502.000
[/Quote]
嗯,明白了,按照你的道理,如果计算结果赋值给 double 型数据 转换成 整数后反而会得到一个错误的结果,马上试验下
anyingliesou 2010-09-13
  • 打赏
  • 举报
回复
5.02 不到5.02
你可以先精确计算,然后 在转换
雪影 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fycom200 的回复:]

引用 13 楼 zeming_gu 的回复:
用float


C/C++ code
float f=5.02;
float f2=(f*100);
double d=f2;


这样你可以看到d的值为501.99999809265 ,转成int当然就成了501咯

嗯, 但为何将结果赋值给 float 类型的变量后,再转成整数结果又是正确的了呢???
[/Quote]

这个需要根据你需要精确的位数而定。在需要得到int结果时,需要将浮点类型数据转换成整数,然后计算。

float a=5.02;
int b=100;
int c= (int)((a*100 + 0.5)/100) * b;
ZM 2010-09-13
  • 打赏
  • 举报
回复
因此501.99999809265转成float就成了502.000
ZM 2010-09-13
  • 打赏
  • 举报
回复
float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型)
赋值时,一律是右部值转换为左部类型
fycom200 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zeming_gu 的回复:]
用float


C/C++ code
float f=5.02;
float f2=(f*100);
double d=f2;


这样你可以看到d的值为501.99999809265 ,转成int当然就成了501咯
[/Quote]
嗯, 但为何将结果赋值给 float 类型的变量后,再转成整数结果又是正确的了呢???
ZM 2010-09-13
  • 打赏
  • 举报
回复
用float

	float f=5.02;
float f2=(f*100);
double d=f2;


这样你可以看到d的值为501.99999809265 ,转成int当然就成了501咯
ZM 2010-09-13
  • 打赏
  • 举报
回复
float 502.000被强制转化为int,数据丢失。
fycom200 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tttyd 的回复:]
这个很正常啊
在计算机中表示5.02的数是一个无限接近于5.02的浮点数。也就是5.01999999999999999999

5.01999999999999999999 * 100.000000000000 = 501.9999999999999999999

float a = 501.9999999999999999999;
int b = (int) a;
printf("……
[/Quote]
这个答案应该是准确的,但请问如何解决这种情况?
teleinfor 2010-09-13
  • 打赏
  • 举报
回复
这么写出来的果然是502!不懂了。。呵呵。。。是不是compiler的问题。

float a = 5.02;
int b = (int)(a*100);


[Quote=引用 3 楼 fycom200 的回复:]

C/C++ code
unsigned short t=setdj.InputDJ*(float)100;

上面是代码
InpputDJ是 float 变量,也是一个编辑框的变量
[/Quote]
Allen_zhang 2010-09-13
  • 打赏
  • 举报
回复

// 测试的代码
float a = 5.02;
float b = a * 100;
unsigned int c = a * 100;
unsigned int d = b;
unsigned int e = (UINT)(float)(a * 100);

TRACE( _T("a:%f, b:%f, c:%d, d:%d, e:%d \n"), a, b, c, d, e );

// 打印的结果
// a:5.020000, b:502.000000, c:501, d:502, e:501

// 确实有点奇怪,原因不大清楚,等待高人来解答。不过可以按照d的那种方式来计算就可以得到正确的值。
雪影 2010-09-13
  • 打赏
  • 举报
回复
这个很正常啊
在计算机中表示5.02的数是一个无限接近于5.02的浮点数。也就是5.01999999999999999999

5.01999999999999999999 * 100.000000000000 = 501.9999999999999999999

float a = 501.9999999999999999999;
int b = (int) a;
printf("%d",b); //输出501
Eleven 2010-09-13
  • 打赏
  • 举报
回复

float a = 5.02f;
a *= 100;
CString str;
str.Format(_T("%lf"), a);
AfxMessageBox(str);

502.000000,不是你说的501
fycom200 2010-09-13
  • 打赏
  • 举报
回复
调试显示 InputDJ 的值确实是 5.02 ,但X100后就t变成501了
lazy_2010 2010-09-13
  • 打赏
  • 举报
回复
使用

int a_int = (int)(a * 100 + 0.5f);

或者

int a_int = (int)(a * 100 + 0.0001f);

应该没有问题的
fycom200 2010-09-13
  • 打赏
  • 举报
回复
unsigned short t=setdj.InputDJ*(float)100;

上面是代码
InpputDJ是 float 变量,也是一个编辑框的变量
teleinfor 2010-09-13
  • 打赏
  • 举报
回复
不会吧!误差这么大那不是成了错误了!上你的代码看看。
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧