关于取整

publicshj 2003-06-07 04:17:52
在c语言中,实现取整

如对0.825356356,取0.825

实现程序如下

double fTo(double x)
{
double n2;
int n1;
n1=(int)(x*1000000);
n2=((double)n1)/100000;
return n2;
}

不能得到结果,那位指点一下阿

如果方便,最好写一下正确代码,谢谢
...全文
670 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuxiaojie 2003-06-11
  • 打赏
  • 举报
回复
up
shanweibing 2003-06-10
  • 打赏
  • 举报
回复
在c的教材上讲了Gallen的方法,zark的方法用字符串解决了可能的溢出问题!
Zark 2003-06-10
  • 打赏
  • 举报
回复
解决方法有二:
一. 你把ch.c更名为ch.cpp
二. 函数重写如下:
double RoundDouble(double dVal)
{
char szVal[256];
char* ptr;
double dRet;

sprintf(szVal,"%lf",dVal);
ptr=strstr(szVal,".");
ptr+=4;
*ptr='\0';
sscanf(szVal,"%lf",&dRet);
return dRet;
}
qizi0wang 2003-06-10
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
double fTo(double x)
{
double n2;
int n1;
n1=(int)(x*1000);
n2=((double)n1)/1000;
return n2;
}

int main(){
double a=0.825356356;
cout<<fTo(a);
return 0;
}
测试过的 输出为:0.825
Zark 2003-06-10
  • 打赏
  • 举报
回复
抱歉,写TCHAR多了,手顺,就把_T("");

double RoundDouble(double dVal)
{
char szVal[256];
sprintf(szVal,"%lf",dVal);
char* ptr=strstr(szVal,".");
ptr+=4;
*ptr='\0';
double dRet;
sscanf(szVal,"%lf",&dRet);
return dRet;
}

晨星 2003-06-10
  • 打赏
  • 举报
回复
为什么一定要“取整”?把精度都丢失了。如果你只是想输出时好看些的话,在输出时指定小数的位数不就行了吗?

double d = 0.123456789;
printf("%.3f\n" , d);

就会打印出0.123。
而且丝毫不影响d的精度。
greatzhum 2003-06-10
  • 打赏
  • 举报
回复
gallen和我的方法一样
我试过很多
相乘的数如果超过10000就会出错溢出
......
=======================================================================
因为你定义的是int n1;最大正值为32767,你乘10000会溢出,可以用long来定义n1。当然只是针对你的题目,如果数据更大,就可能需要用到上面zark提的方法了,琢磨琢磨...
publicshj 2003-06-10
  • 打赏
  • 举报
回复
Zark用字符串匹配的方法错误好像很多阿
一直修改不对,主要是不知道_T("%f")到底是什么意思
那位帮忙修改一下阿
3ks
publicshj 2003-06-10
  • 打赏
  • 举报
回复
可是重复计算的结果就是错的阿
晨星 2003-06-10
  • 打赏
  • 举报
回复
你多心了,^o^
这根本不会产生什么溢出的。你放心好了,系统存不下的位数会自动舍弃。

用10进制打个比方吧,假如说系统中浮点数的精度是5位有效数字,
则系统会自动把0.12345×0.56789的结果保存成:0.07012或者0.07011而决不会是0.0701060205。
publicshj 2003-06-10
  • 打赏
  • 举报
回复
我在写一个程序
其中有一些比较小的数相乘
为了不使相乘结果溢出
所以应该对每次相乘的结果进行舍去处理
每次舍去之后小数点后留下7到8位
这样才可以保证不溢出
所以要做这个取整运算
大家想想办法阿
拜托
publicshj 2003-06-10
  • 打赏
  • 举报
回复
我编译Zark的程序时,结果出现如下错误
│ Error H:\TC2\CH.C 54: Expression syntax in function RoundDouble
│ Error H:\TC2\CH.C 55: Undefined symbol 'ptr' in function RoundDouble
│ Error H:\TC2\CH.C 56: Invalid indirection in function RoundDouble
│ Error H:\TC2\CH.C 57: Expression syntax in function RoundDouble
│ Error H:\TC2\CH.C 58: Undefined symbol 'dRet' in function RoundDouble

我的程序是

#include<stdio.h>
#include<string.h>
double RoundDouble(double dVal)
{
char szVal[256];
sprintf(szVal,"%lf",dVal);
char *ptr=strstr(szVal,".");
ptr+=4;
*ptr='\0';
double dRet;
sscanf(szVal,"%lf",&dRet);
return dRet;
}

main()
{
printf("%f\n",RoundDouble(0.862536456));
printf("%f\n",(0.862536456*1000000));
printf("\n");printf("\n");printf("\n");
}

我也不知道是什么原因了
那位指点一下 阿

Zark 2003-06-10
  • 打赏
  • 举报
回复
笔误,更正:

double RoundDouble(double dVal)
{
char szVal[256];
sprintf(szVal,_T("%f"),dVal);
char* ptr=strstr(szVal,".");
ptr+=4;
*ptr='\0';
double dRet;
sscanf(szVal,_T("%f"),&dRet);
return dRet;
}
Zark 2003-06-10
  • 打赏
  • 举报
回复
为了避免可能的溢出,可以试试这个:

double RoundDouble(double dVal)
{
char szVal[256];
sprintf(szVal,_T("%f"),double);
char* ptr=strstr(szVal,".");
ptr+=4;
*ptr='\0';
double dRet;
sscanf(szVal,_T("%f"),&dRet);
return dRet;
}

(以上程序未经测试,使用者后果自负,作者保留所有版权)
publicshj 2003-06-10
  • 打赏
  • 举报
回复
gallen和我的方法一样
我试过很多
相乘的数如果超过10000就会出错溢出
不知道还有那位高手知道其他方法

据说用字符串匹配可以
那位指点一下怎么做阿
3ks

zhaohangcom 2003-06-07
  • 打赏
  • 举报
回复
注释一下~~这是标准库中的
zhaohangcom 2003-06-07
  • 打赏
  • 举报
回复
cout.setf(ios::fixed,ios::floatfield);
cout.precision(2);
cout<<'$'<<5/12<<endl;
晨星 2003-06-07
  • 打赏
  • 举报
回复
呵呵,好像Gallen是对的。
我说的是另外一个问题了,^_^。
晨星 2003-06-07
  • 打赏
  • 举报
回复
浮点数存在精度问题,因此不可能完全准确。
原因是,浮点数的二进制表示和十进制表示表示之间的转换并不像整数那么简单。不信你手工试试用2进制表示0.3。
其实如果你需要所有的数都保留3位小数,那实际上“浮点数”也就成了“定点数”,因此你可以用整数保存他们,然后使用时除以1000。当然,还是一样,除了之后不可能完全准确。
Gallen 2003-06-07
  • 打赏
  • 举报
回复
double fTo(double x)
{
double n2;
int n1;
n1=(int)(x*1000);
n2=((double)n1)/1000;
return n2;
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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