回 帖 发 新 帖 刷新版面

主题:[讨论]如何提取小数点后面的数字,求高人指点,在线等

举个例子: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个回复)

沙发

double in;
int a1,a2;
cin>>in;
a1=in;   //a1就是小数点前面的数

in-=a1;
a2=in*100;  //a2就是小数点后面的数

弄那么多没用的变量干嘛?

板凳

楼上的没有找到症结所在,我自己发现在出现36.3201这类数字的时候程序运行正常,但是遇到36.3200这样的数字周后就出现问题了,问题在提取到第3到4位小数的时候x1本应该是32.00,但是转换过后x1变成了31.00,我怀疑是因为强制类型转换而导致的,上面的那段程序是我从程序中子程序中截取出来的,变量多了点!

3 楼

有个现成的提取浮点数整数部分和小数部分的函数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 楼

你的程序我调了一下,问题确实如你所说的.

调试下,对double类型的 a 输入 24.3600 实际得到的结果是: 24.35999...
也就是说cin>>a; //输入24.3600 最后  a的值为:24.3599999....所以才会出现上面的问题.

至于为什么会这样,我也不清楚,如果你找到了答案,希望你在论坛上给我发个消息,谢谢.

把double 类型换成 float 类型后,就不会存在上面的问题了.

你提得问题很好.

5 楼

整个小数减去它的整数部分就行了,利用强转。

#include <iostream.h>
void main()
{
    double a;
    cout<<"请先输入一个小数:";
    cin>>a;
    a=a-(int)a;
    cout<<"这个数的小数部分是:"<<a<<endl;
}
--------------------------------------------------------
(int)a的意思是将原本double型的a变量强行转换成整型(int),取得整个小数的整数部分。

6 楼

为什么不用向下取整函数呢?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 楼


第一,我觉得这样写太复杂了
第二,我觉问题在于类型转换的,a实际的输入是24.35999999999999,后面有13个9

8 楼

这个问题我以前也接触过,开始的时候我也找不到问题的原因,后来我进了一个技术交流群,这个群里的人挺多的,在里面可以沟通技术,你可以进去看一下.群号是:六#二#八#七#八#零#四#三。另外,这个群里可以接项目。

我来回复

您尚未登录,请登录后再回复。点此登录或注册