浮動小数点の0.12を文字列に変換できる関数を作ろうと思っているのですが
方法が分からず出来ません。
main()
{
double kazu = 0.12;
CString kekka = henkan(kazu);
}
CString henkan(double kazu)
{
CString kekka;
//????(ここの処理が分からない)
return kekka;
}
//????の部分の処理を教えてください。
_gcvtとかではだめですか?
CString::Format
kekka.Format(%f, kazu);
あ、だめだわ、これ。ごめんなさい。
sprintf
どの方法でも出来ました。
有難うございます!
こんなかんじかなぁ。
kekka.Format(%lf, kazu);
while(kekka.ReverseFind('0') != -1){
if(kekka.ReverseFind('0') != kekka.GetLength() - 1) break;
kekka = kekka.Left(kekka.GetLength() - 1);
}
あたりまえだけど、kazu=0.120
としても0.120という文字には変換できないよん。
>あたりまえだけど、kazu=0.120
>としても0.120という文字には変換できないよん。
当たり前でしょうか?
double kazu=0.120;
CString kekka;
kekka.Format( %4.3f, kazu );
で0.120になりますよ。
浮動小数点の精度のことを言いたかったのではないでしょうか?
> kekka.Format( %4.3f, kazu );
の.3はどうやってもってきたのかな?
sprintfではWarningがでるので
double d=...;
(int)(10*d)%10,(int)(100*d)%10,...
という方法で小数点以下を記述しています
苦肉の策です
> kekka.Format(%lf, kazu);
> while(kekka.ReverseFind('0') != -1){
> if(kekka.ReverseFind('0') != kekka.GetLength() - 1) break;
> kekka = kekka.Left(kekka.GetLength() - 1);
> }
// CStringは比較演算子がオーバーロードされているので、これで充分かと。
kekka.Format(%lf, kazu);
while (kekka.Right(1) == 0) {
kekka = kekka.Left(kekka.GetLength() - 1);
}
// または、↓のほうが速いかも
kekka.Format(%lf, kazu);
while (kekka.Right(1) == 0) {
kekka.Delete(kekka.GetLength() - 1, 1);
}
# ケチをつけるつもりはありませんが、CString::GetLength()や
# CString::ReverseFind()を何度も使うとスピードがもったいない
# 気がしてしまうから。
kekka.Format(%g,kazu);
では、駄目なんですか?
実行速度を気にするんだったら、CString::Right()や
CString::Left()なんて恐ろしくて使えないですが(^^;