怎么算才能不出错??小数的精度问题?

dszy 2003-07-10 02:44:36
float inta,Dec1;
int Dec2,DecHex,DecL,DecH;


inta=SetFreq*0.00025;
Dec1=inta-int(inta); //小数
Dec2=int(Dec1*4000);
ShowMessage(IntToStr(Dec2)+" "+FloatToStr(Dec1*4000)+" "+FloatToStr(Dec1));

现在如果SetFreq=360001, 则结果为:
1 1.007080078125 0.00025177001953125
如果SetFreq=360007。则:
6 6.988525390625 0.00174713134765625

可是正确结果应该是:
7 7 0.00175

我怎么才能得到正确的结果呢??
...全文
28 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qibo999 2003-07-11
  • 打赏
  • 举报
回复
计算机是这样的,得到的其实是个约数。你应该依据一定的计算精度,double的精度高于float,或者你自己来根据精度要求用格式约束数值。
cupidvenus 2003-07-11
  • 打赏
  • 举报
回复
double和float类型都是有误差的,要想进行绝对精确的运算,自己写个新的运算类。
dszy 2003-07-11
  • 打赏
  • 举报
回复
要是说10/3=3.333333我可以接受,
可是明明0。00025*4000=1,就算不准确也应该是1。00000呀,怎么会是1.007080078125???
Behard 2003-07-10
  • 打赏
  • 举报
回复
其实就算是 double 都是会有误差的
输出时请指定输出长度,判断是请使用 fabs 的值小于一个很小的值

-----------------------------------
现在混水园了!
Behard 2003-07-10
  • 打赏
  • 举报
回复
float 精度不够引起的出错,要精确请使用 double 或者 long double
void __fastcall TForm1::Button2Click(TObject *Sender)
{
double /*float*/ inta,Dec1;
int Dec2,DecHex,DecL,DecH;

int SetFreq = 360007;
inta = SetFreq* 0.00025;
Dec1 = inta- (int)inta; //小数
Dec2 = (int) (Dec1* 4000);
ShowMessage(IntToStr(Dec2)+" "+FloatToStr(Dec1*4000)+" "+FloatToStr(Dec1));
}

-----------------------------------
现在混水园了!
Behard 2003-07-10
  • 打赏
  • 举报
回复
如果是后面原来计算的话,都是使用 float 或者 double 即可

-----------------------------------
现在混水园了!
dszy 2003-07-10
  • 打赏
  • 举报
回复
我就不信这里没有人会???
dszy 2003-07-10
  • 打赏
  • 举报
回复
可是楼上的,我并不只是要显示不出现问题。
而是要真正的数值也没有问题这个数我后面还要用呀
loking 2003-07-10
  • 打赏
  • 举报
回复
float x=12.12465488957498665;
ShowMessage(FormatFloat("0.#####",x));//五位小数
ShowMessage(FormatFloat("#",x));//没有小数
dszy 2003-07-10
  • 打赏
  • 举报
回复
第一行的结果就不对呀:
1 1.007080078125 0.00025177001953125

应该是
1 1 0.00025
dszy 2003-07-10
  • 打赏
  • 举报
回复
我改过了,一样的结果
Wingsun 2003-07-10
  • 打赏
  • 举报
回复
不要用int类型,改为double或者float类型

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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