好心人请帮忙啊!!!

gsqd 2005-03-11 08:55:44
我同学给我出了一道题,如何在C++中实现小数任意位的四舍五入,我想了很久也没想出来,希望有高人指点,讲一下大概的算法就可以了.谢谢!!!
...全文
115 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fhvk 2005-03-12
  • 打赏
  • 举报
回复
不知可不可以用数组实现,试一下!
zengwujun 2005-03-12
  • 打赏
  • 举报
回复
mark
gsqd 2005-03-12
  • 打赏
  • 举报
回复
实在感谢好心人的帮助!楼上的朋友,其实我也考虑过这个问题,但迫于无奈(我的水平太菜了).所以希望有高手写了给我学习学习!!!
xialin168 2005-03-12
  • 打赏
  • 举报
回复
4.6732 = 假如是取小数点后一位的话 就是 ((float)((4.67 * 100 + 5)/10))/10.0
--------------------------------------------------------
4.6732 = 假如是取小数点后一位的话 就是 (float)(4.6732 * 1000 + 0.5)/1000.0

==>4.6732 = 假如是取小数点后一位的话 就是 (float)(4.6732 * 10 + 0.5)/10.0

不要犯小错误!
pcboyxhy 2005-03-11
  • 打赏
  • 举报
回复
上面那个代码有一下几个不足之处
1.不能处理大于9位,输出格式控制符处处理没有考虑大于9的情况。
2.int 型的p可能会溢出。
3.double 的精度问题。

另外一个办法就是,
把输入的数当作字符串处理,
这样可以处理"任意"(还是有一定范围限制)多位
pcboyxhy 2005-03-11
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int foo(double number, int k)
{
int p=(int)pow( 10.0f, (float)k );
char format[]="%. lf\n";
printf("%lf %d位 -> ", number, k);
number *= p;

if(number>0)
number = (int)(number+0.5);
else
number = (int)(number-0.5);

number /= p;
format[2] =k+48;
printf(format, number);
}
int main(int argc, char *argv[])
{
double test = 1235.1234782;
double test2 = -1235.1234782;
int i;
for(i=1; i<7; ++i)
{
foo(test, i);
foo(test2, i);
}
system("PAUSE");
return 0;
}


运行结果是
1235.123478 1位 -> 1235.1
-1235.123478 1位 -> -1235.1
1235.123478 2位 -> 1235.12
-1235.123478 2位 -> -1235.12
1235.123478 3位 -> 1235.123
-1235.123478 3位 -> -1235.123
1235.123478 4位 -> 1235.1235
-1235.123478 4位 -> -1235.1235
1235.123478 5位 -> 1235.12348
-1235.123478 5位 -> -1235.12348
1235.123478 6位 -> 1235.123478
-1235.123478 6位 -> -1235.123478
请按任意键继续. . .
Dong 2005-03-11
  • 打赏
  • 举报
回复
4.6732 = 假如是取小数点后一位的话 就是 ((float)((4.67 * 100 + 5)/10))/10.0
--------------------------------------------------------
4.6732 = 假如是取小数点后一位的话 就是 (float)(4.6732 * 1000 + 0.5)/1000.0

这只是其中一种,但数值大的时候会溢出!因为float的存储整数的范围不比unsign int大!好象还比long小!
Salam2001 2005-03-11
  • 打赏
  • 举报
回复
通用公式,四舍五入到小数点后第n位(保留第n位):
double x, y;

对于正数:
y = int( x * pow( 10, n ) + 0.5 ) / pow( 10, n );

对于负数:
y = int( x * pow( 10, n ) - 0.5 ) / pow( 10, n );

pow( 10, n ) 是指10的n次方。
truewill 2005-03-11
  • 打赏
  • 举报
回复
-_-||

好像说反了
truewill 2005-03-11
  • 打赏
  • 举报
回复
先乘10的n次方,取整,再除10的n次方
Squall1009 2005-03-11
  • 打赏
  • 举报
回复
4.6732 = 假如是取小数点后一位的话 就是 ((float)((4.67 * 100 + 5)/10))/10.0
gdhyj 2005-03-11
  • 打赏
  • 举报
回复
不说我还不知道,我还以为在32位机上是一个指针是4呢,果然是1,在linux的gcc下也如此

64,282

社区成员

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

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