主题:[讨论]如何提取小数点后面的数字,求高人指点,在线等
wilsonlf
[专家分:0] 发布于 2008-08-07 14:40:00
举个例子:24.36
我要分别提取整数24
小数点后的两位36
请问c++中是否有现成的语句?
我使用的是面向对象的编程
以下是我编写的程序,但是出现了很大的问题
在输入24.3600的时候计算出错
double a=0,z=0,x1=0,x2=0,m=0,test;int h,k=0,c=2;
cout<<"输入"<<endl;
cin>>a;//输入24.3600
h=a;z=(int)h;a=a-z;//z是整数
a=a*100;
h=a;x1=(int)h;a=a-x1;//x1是小数点后1-2位,应该是36
a=a*100;
x2=a;//提取完毕//x2是小数点后3-4位,应该是00
cout<<z<<" "<<x1<<" "<<x2<<endl;//但是输出的时候x1=35,x2=100
出错了
回复列表 (共8个回复)
沙发
s110 [专家分:1060] 发布于 2008-08-07 15:27:00
double in;
int a1,a2;
cin>>in;
a1=in; //a1就是小数点前面的数
in-=a1;
a2=in*100; //a2就是小数点后面的数
弄那么多没用的变量干嘛?
板凳
wilsonlf [专家分:0] 发布于 2008-08-07 16:44:00
楼上的没有找到症结所在,我自己发现在出现36.3201这类数字的时候程序运行正常,但是遇到36.3200这样的数字周后就出现问题了,问题在提取到第3到4位小数的时候x1本应该是32.00,但是转换过后x1变成了31.00,我怀疑是因为强制类型转换而导致的,上面的那段程序是我从程序中子程序中截取出来的,变量多了点!
3 楼
liuluning [专家分:3340] 发布于 2008-08-08 00:44:00
有个现成的提取浮点数整数部分和小数部分的函数modf,不知是否适合你的需求:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
double d,i,j;
d=24.36;
j=modf(d,&i);
cout<<"整数部分:"<<i<<endl;
cout<<"小数部分:"<<j<<endl;
return 0;
}
4 楼
s110 [专家分:1060] 发布于 2008-08-09 16:52:00
你的程序我调了一下,问题确实如你所说的.
调试下,对double类型的 a 输入 24.3600 实际得到的结果是: 24.35999...
也就是说cin>>a; //输入24.3600 最后 a的值为:24.3599999....所以才会出现上面的问题.
至于为什么会这样,我也不清楚,如果你找到了答案,希望你在论坛上给我发个消息,谢谢.
把double 类型换成 float 类型后,就不会存在上面的问题了.
你提得问题很好.
5 楼
kasijia [专家分:0] 发布于 2008-08-10 20:37:00
整个小数减去它的整数部分就行了,利用强转。
#include <iostream.h>
void main()
{
double a;
cout<<"请先输入一个小数:";
cin>>a;
a=a-(int)a;
cout<<"这个数的小数部分是:"<<a<<endl;
}
--------------------------------------------------------
(int)a的意思是将原本double型的a变量强行转换成整型(int),取得整个小数的整数部分。
6 楼
ws0813 [专家分:40] 发布于 2008-08-12 00:35:00
为什么不用向下取整函数呢?double floor(double x)定义在math.h里
#include<iostream.h>
#include<math.h>
void main()
{
double n,m;
int x;
x=0;
cout<<"输入一个小数:";
cin>>n;
x=int(floor(n));
m=n-x;
cout<<"整数部分是:"<<x<<" 小数部分是:"<<m<<endl;
}如果是要把小数位的每一位都提出来,那么就要知道小数点后具体有几位,然后再乘出来。
7 楼
YaAnn [专家分:1630] 发布于 2008-08-12 19:54:00
第一,我觉得这样写太复杂了
第二,我觉问题在于类型转换的,a实际的输入是24.35999999999999,后面有13个9
8 楼
rtgongchengshi [专家分:90] 发布于 2008-08-14 09:15:00
这个问题我以前也接触过,开始的时候我也找不到问题的原因,后来我进了一个技术交流群,这个群里的人挺多的,在里面可以沟通技术,你可以进去看一下.群号是:六#二#八#七#八#零#四#三。另外,这个群里可以接项目。
我来回复