浮動小数点の計算は、C++ではちょっと難しいです(Javaや他の言語でも同じです)。あなたはそれらの直接比較を避け、それらを使用する際に、予測可能な結果を得るために、いくつかの他のものを行う、検討する必要があります。
私は2つのバリアントを提案することができ、問題の現実的な解決策については
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"
: ヴァール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++フォーマット関数を使用することであり、次いで、得られた文字列を分割:桁数を指定することを可能にします。
[小数点の取得](http://stackoverflow.com/questions/4427897/get-the-decimal-point) – IAmBlake
重要な桁数は何ですか?小数部分が15桁の場合はどうなりますか?その15桁の値全体を保存しようとしていますか?これは次の質問につながります。あなたが解決しようとしている高レベルの問題は何ですか?分割する数字が必要ですか? – PaulMcKenzie