C++中取整的问题。

zhangmq01 2012-03-07 04:39:28
定义一个类型为short的变量a,
对a进行复制,不如赋值为3560。
对a进行取整操作,代码如下:
a=a/100*100;
最后的结果是3500.
如果代码换为:
a=a/1000*1000;
最后的结果变为3000.

这是什么样的机理?
...全文
458 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-03-07
  • 打赏
  • 举报
回复
//Round(1.234,2) = 1.23
//Round(1.234,0) = 1.0
//Round(123.4,-1) = 120.0
double Round(double dVal, short iPlaces) {
double dRetval;
double dMod = 0.0000001;
if (dVal<0.0) dMod=-0.0000001;
dRetval=dVal;
dRetval+=(5.0/pow(10.0,iPlaces+1.0));
dRetval*=pow(10.0,iPlaces);
dRetval=floor(dRetval+dMod);
dRetval/=pow(10.0,iPlaces);
return(dRetval);
}

double round(double dVal, short iPlaces) //iPlaces>=0
{
unsigned char s[20];
double dRetval;

sprintf(s,"%.*lf",iPlaces,dVal);
sscanf(s,"%lf",&dRetval);
return (dRetval);
}
从头来过 2012-03-07
  • 打赏
  • 举报
回复
如题[Quote=引用 1 楼 baichi4141 的回复:]
整数除整数,结果向下取整

3560/100 = 35
3560/1000 = 3
[/Quote]
zhangmq01 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 baichi4141 的回复:]
引用 11 楼 zhangmq01 的回复:
讲得非常透彻!但是上面的有一个疑问还没有解决,就是:建立一个浮点类型的变量b,然后b=3560/100,那么结果是多少,是35还是35.6?

是35
右边计算完之后才赋值给左边,计算和赋值是两个步骤,前后顺序泾渭分明,b的类型完全不影响右边的计算过程
这样做在编译器看来是把低精度数据赋给高精度变量,没有精度损失所以不会报警告
[/Quote]
非常感谢!
baichi4141 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhangmq01 的回复:]
讲得非常透彻!但是上面的有一个疑问还没有解决,就是:建立一个浮点类型的变量b,然后b=3560/100,那么结果是多少,是35还是35.6?
[/Quote]
是35
右边计算完之后才赋值给左边,计算和赋值是两个步骤,前后顺序泾渭分明,b的类型完全不影响右边的计算过程
这样做在编译器看来是把低精度数据赋给高精度变量,没有精度损失所以不会报警告
zhangmq01 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 baichi4141 的回复:]
引用 8 楼 zhangmq01 的回复:

引用 5 楼 baichi4141 的回复:
引用 3 楼 zhangmq01 的回复:

如果我想确实想得到3560/100的值35.6的话,应该怎么设计代码呢?

被除数和除数任何一个是浮点型,则按浮点型计算

3560*1.0/100=35.6

100默认是整型?100.0就是浮点数了?


第一,两个不同类型的数据……
[/Quote]
讲得非常透彻!但是上面的有一个疑问还没有解决,就是:建立一个浮点类型的变量b,然后b=3560/100,那么结果是多少,是35还是35.6?
baichi4141 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhangmq01 的回复:]

引用 5 楼 baichi4141 的回复:
引用 3 楼 zhangmq01 的回复:

如果我想确实想得到3560/100的值35.6的话,应该怎么设计代码呢?

被除数和除数任何一个是浮点型,则按浮点型计算

3560*1.0/100=35.6

100默认是整型?100.0就是浮点数了?
[/Quote]

第一,两个不同类型的数据进行数学运算时,结果按照精度较高的类型计算,所以计算结果按照1.0精度表示,得到35.6
第二,35.6乘以100,同样按35.6的精度表示,得到3560.0
第三,把精度较高的浮点数3560.6赋给精度较低的整型,编译器发出警告:可能丢失数据精度

解决方法一:使用强制类型转换,a=(short)( a*1.0/100*100 )
解决方法二:全部使用精度较高的浮点数来存储数据
zhangmq01 2012-03-07
  • 打赏
  • 举报
回复
将代码中的100改成100.0之后出现错误:
warning C4244: '=' : conversion from 'double' to 'short', possible loss of data
zhangmq01 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 baichi4141 的回复:]
引用 3 楼 zhangmq01 的回复:

如果我想确实想得到3560/100的值35.6的话,应该怎么设计代码呢?

被除数和除数任何一个是浮点型,则按浮点型计算

3560*1.0/100=35.6
[/Quote]
100默认是整型?100.0就是浮点数了?
zhangmq01 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiyoulaoyuanjia 的回复:]
short 型本身没小数部分,short和short型的数据操作,得到的结果肯定是整数型的,而小数部分直接去掉了,所以
3560/100 = 35
3560/1000 = 3
[/Quote]
short型确实是整型,没有小数部分,这个是对的。但是在我写的代码:a=a/100*100中,a与a之间没有发生数据操作吧?等号的右边3560/100首先等于35.6,然后35.6*100=3560,3560再赋给a,最后a应该是3560才对。不改变等号的右边,怎么才能得到3560呢?
pengchy 2012-03-07
  • 打赏
  • 举报
回复
3560/100.0f
baichi4141 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangmq01 的回复:]

如果我想确实想得到3560/100的值35.6的话,应该怎么设计代码呢?
[/Quote]
被除数和除数任何一个是浮点型,则按浮点型计算

3560*1.0/100=35.6
xiyoulaoyuanjia 2012-03-07
  • 打赏
  • 举报
回复
short 型本身没小数部分,short和short型的数据操作,得到的结果肯定是整数型的,而小数部分直接去掉了,所以
3560/100 = 35
3560/1000 = 3
zhangmq01 2012-03-07
  • 打赏
  • 举报
回复
如果我想确实想得到3560/100的值35.6的话,应该怎么设计代码呢?
pengzhixi 2012-03-07
  • 打赏
  • 举报
回复
计算机可不会约分抵消。他只知道一个一个步骤来计算。
baichi4141 2012-03-07
  • 打赏
  • 举报
回复
整数除整数,结果向下取整

3560/100 = 35
3560/1000 = 3

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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