我获得了double x = 23.456;
和两个整数d和c。
我必须打破它,以便d得到值23,c得到值456。
我想到了以下几点: -
int d;
d=(int)x;
但我想不出用c做什么,因为它是一个整数,如果我写
c=(x-d)*1000;
那么它可能仅适用于这种情况,而不适用于任何其他情况。
有没有办法得到小数点后的位数,然后乘以相等数量的零。 请帮忙!!!
答案 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 ++格式化函数,然后拆分生成的字符串。