将小数点分成两个整数

时间:2016-12-17 09:07:16

标签: c++

我获得了double x = 23.456;和两个整数d和c。 我必须打破它,以便d得到值23,c得到值456。 我想到了以下几点: -

int d;
d=(int)x;

但我想不出用c做什么,因为它是一个整数,如果我写

c=(x-d)*1000;

那么它可能仅适用于这种情况,而不适用于任何其他情况。

有没有办法得到小数点后的位数,然后乘以相等数量的零。 请帮忙!!!

2 个答案:

答案 0 :(得分:2)

您可以重复乘以10,直到小数点后面没有任何内容。

AdaptiveGV.ItemsSource = ImageCollection;

您可能还需要double c = x - d; while(c - floor(c) > 0.0) {c *= 10;} 来设置楼层功能,这会向下舍入一个数字。例如#include <math.h>返回4.0

答案 1 :(得分:0)

C ++中的浮点计算有点棘手(Java和其他语言也是如此)。你应该避免直接比较并做一些其他的事情来获得可预测的结果,考虑:

double d1=1.1;
double d2= d1 / 10.0;

if(d2==0.11)cout << "equals" << endl;
else cout << "not equals" << endl;   //result is "not equals"

d1=1.99;
float  f1=0.01f;
double d3=d1+f1;
if(d3==2.0)cout << "equals" << endl;
else cout << "not equals" << endl;  //result is "not equals"

d1=1.99;
d2=0.01;
d3=d1+d2-2.0;
if(d3==0.0)cout << "equals" << endl;
else cout << "not equals" << endl;   //result is "not equals"

至于问题的实际解决方案,我可以建议2种变体: Var 1是使用一个允许指定位数的函数:

#include <iostream>
#include <cmath>

using namespace std;


void split_double(const double value, int& i_part, int& r_part,
                  const int max_digits_after_dp, int min_digits_after_dp){


    auto powerOfTenL = [](int power){ int result = 1;
        for(int i=0;i<power;++i)result *= 10;
        return result;
    };
    //Get integral part
    i_part = (int)value;
    double temp = (value-i_part);
    double pOfTen = powerOfTenL(max_digits_after_dp);
    temp *= pOfTen;
    //Get real part
    r_part = round(temp);

    //Remove zeroes at the right in real part
    int num_of_d = max_digits_after_dp;
    if(min_digits_after_dp>max_digits_after_dp)
        min_digits_after_dp=max_digits_after_dp;
    while (num_of_d>min_digits_after_dp) {
        //If the number is divisible by 10, divide it by 10
        if(0==(r_part%10)) { r_part /=10; num_of_d--;
        }
        else break; //Last digit is not 0
    }
}

int main(int argc, char *argv[])
{

    double value = 10.120019;
    int ipart,rpart;
    const int digitsMax = 6;
    const int digitsMin = 3;

    split_double(value,ipart,rpart,digitsMax,digitsMin);
    cout<<"Double " <<value << " has integral part " <<ipart
       <<" and real part "<<rpart<<endl;

    return 0;
}

解决问题的第二个变体是使用像vsprintf这样的C / C ++格式化函数,然后拆分生成的字符串。