作者adrianshum (Alien)
看板C_and_CPP
标题Re: [问题] 预设的 double -> int 隐式转换或强制转换
时间Tue Apr 28 10:59:41 2009
※ 引述《lytn (sapphira)》之铭言:
: 经过我自己测试的结果,
: 在Dev-C++ 或是VC++里测试
: double a=4.9;
: int b=a; //or int b=(int)a;
: cout b; << b会等於
: 好像就是直接舍位了.想知道这是C++的标准预设吗?
: 在C里面 math.h 还有提供 ceil() ,floor()来做进位跟舍位
: 但是我书上写的这两个函式的传回值都是double,
: 如果真的要整数的话,势必还要转型,所以才会在意到底是转成怎麽样的.
: 或是有没有可靠的预设函式可以直接拿到整数的?
: 另外我是自己做一个ceil函式啦,也想知道这样搞跟#include<cmath> 之类的哪个比较快,
: 因为我真的没有用很多cmath,math.h 里的东西.
double 转 整数, 就单纯的 truncate.
这是标准, 不用担心.
: int IntUp(double adouble){ //无条件进位
: int tempint;
: tempint=adouble;
: if(tempint<adouble){return (tempint+1);}
: else{return tempint;}
: };
: int Int_4_5(double adouble){ //四舍五入
: if(adouble>0){
: int temp=IntUp(adouble);
: if((temp-adouble)<0.5){
: return temp;
: }
: else{
: return temp-1;
: }
: }
: }
四舍五入比较单纯一点, 只要
int rounding(double val) { // 要留心 int 的 range 比 double 少
return (int) (val + 0.5);
}
就够了
无条件进位比较复杂一点. (其实四舍五入视乎情况也
应该考虑一样的问题, 不过没那麽明显而已)
因为 浮点数 (double/float) 只是大约数.
刚好 12 的无条件进位, 一般人会觉得应该仍然要维持 12,
可是 12 在 memory 中可能是 12.000000000000001,
单从数值上看, 是 12点几, 又该需要进位.
这种情况你要定义你程式的最小计算单位, 再以此 adjust
你的数值. 比如你知道你的程式最多只会去到小数後4 位,
你可以:
const double EPSILON = 0.00001;
int ceil(double val) {
return (int) (val - EPSILON + 1.0);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82
※ 编辑: adrianshum 来自: 202.155.236.82 (04/28 12:09)
1F:推 VictorTom:+0.5取int之前不是有讨论遇到负数可能会有问题@_@" 04/28 12:37
2F:推 yoco315:复数详细希望 04/28 12:47
3F:→ VictorTom:复数我也不会XD 不过, -4.9+0.5取int似乎是-4不是-5 :) 04/28 12:51
4F:→ adrianshum:嗯, 那加回 if val < 0 就 减 0.5 吧? :P 04/28 16:02