こんにちは、いかについて質問です。
double aaa = 123.456779874243753
上記のaaaを小数点第6位以下を切捨てる。
結果 123.45677
上記方法を教えてください。
環境はvisual studio 2005 .net です。
以下は試したところ誤差が出てしまったので、できれば誤差の出ない切捨て方法をお願いします。
long box = aaa * 100000;
aaa = box / 100000;
小数の桁数を指定した切捨ての仕方
Re:小数の桁数を指定した切捨ての仕方
> 誤差が出てしまったので
この場合は「誤差」とはいわないような...
10進法で表現して誤差がないようにするには、BCD演算でも行うとか、文字列で扱うとかしないとダメです。
この場合は「誤差」とはいわないような...
long box = aaa * 100000; aaa = box / 100000;で多少はましになりますが、誤差が全くなくなるわけではありません。
10進法で表現して誤差がないようにするには、BCD演算でも行うとか、文字列で扱うとかしないとダメです。
Re:小数の桁数を指定した切捨ての仕方
すみません。コピペのミスです。
long box = aaa * 100000; aaa = box / 100000.0;でましになります。
Re:小数の桁数を指定した切捨ての仕方
質問1:
言語はcですか?c++ですか?
回答1:
C++です。
質問2:
切り捨てした結果はどうするのですか?(変数に代入するとか、表示するとか)
回答2:
関数の戻り値として返します。(変数に代入)
前回の質問(標準関数atofについて:2008/02/17(日) 10:32)
の続きになってしまうのですが…以下が現在の状況です。
#######################################################
moji :char型の配列で"123.45678901234567"が格納
ret :double型
box :long型
/* char → double */
ret = atof(moji);
■ret = 123.45678901234567(ウォッチウインドウ表示)
box = ret * 100000;
■box = 12345678(ウォッチウインドウ表示)
ret = box;
ret /= 100000.0;
■ret = 123.45677999999999(ウォッチウインドウ表示)
####################################################
期待値 ret = 123.45678
うまく伝えられなくすいません。
言語はcですか?c++ですか?
回答1:
C++です。
質問2:
切り捨てした結果はどうするのですか?(変数に代入するとか、表示するとか)
回答2:
関数の戻り値として返します。(変数に代入)
前回の質問(標準関数atofについて:2008/02/17(日) 10:32)
の続きになってしまうのですが…以下が現在の状況です。
#######################################################
moji :char型の配列で"123.45678901234567"が格納
ret :double型
box :long型
/* char → double */
ret = atof(moji);
■ret = 123.45678901234567(ウォッチウインドウ表示)
box = ret * 100000;
■box = 12345678(ウォッチウインドウ表示)
ret = box;
ret /= 100000.0;
■ret = 123.45677999999999(ウォッチウインドウ表示)
####################################################
期待値 ret = 123.45678
うまく伝えられなくすいません。
Re:小数の桁数を指定した切捨ての仕方
つまり
double ret = 123.45678901234567;
定義した retの
小数点以下8桁までを表示したいということですか?
切り捨てる関数を double kiri(double)として
double ret2 = kiri(ret);
//ret2を演算に使う。
ret2 =0.5+ret2
という風にしたいわけではなく。
ならこちらでも。
double ret = 123.45678901234567;
定義した retの
小数点以下8桁までを表示したいということですか?
切り捨てる関数を double kiri(double)として
double ret2 = kiri(ret);
//ret2を演算に使う。
ret2 =0.5+ret2
という風にしたいわけではなく。
ならこちらでも。
#include <iostream> #include <string> #include <sstream> #include <iomanip> int main() { double ret = 123.45678901234567; std::ostringstream stream ; stream <<std::setprecision(10) << ret; std::string out; out.assign(stream.str(),0,9); std::cout << out << std::endl; return 0; }
Re:小数の桁数を指定した切捨ての仕方
あら?C++でしたか…
まぁ、せっかくCで組んでみたので、一応載せておきます(^_^;)
結構、力技なのであまり参考にはならないと思いますが…
まぁ、せっかくCで組んでみたので、一応載せておきます(^_^;)
結構、力技なのであまり参考にはならないと思いますが…
int main(void) { double aaa = 123.456779874243753; char str[512], *pchr; // 一度文字列に変換 sprintf(str, "%.16f", aaa); // 文字列内に小数点がある場合は小数点以下6桁目を'\0'に置き換える if ((pchr = strchr(str, '.')) != NULL) *(pchr + 6) = '\0'; // 文字列を数値に戻して画面に表示する aaa = atof(str); printf("%.5f\n", aaa); return 0;
Re:小数の桁数を指定した切捨ての仕方
サンプル回答ありがとうございます。
参考にした結果ですが
小数点位置を戻す前にあらかじめ
小さな数を足してから処理するようにしました。
ret += 0.0000005;
ret /= 100000.0;
■ret = 123.45678000000500(ウォッチウインドウ表示)
ご協力ありがとうございました。
参考にした結果ですが
小数点位置を戻す前にあらかじめ
小さな数を足してから処理するようにしました。
ret += 0.0000005;
ret /= 100000.0;
■ret = 123.45678000000500(ウォッチウインドウ表示)
ご協力ありがとうございました。
外部シンボルが未解決?
こんばんは、また詰まってしまったので質問させていただきますm(--)m
シューティングゲームの館の第8節にて、サンプルをコピペしてプログラムを実行してみたところ、エラーが発生しました。(ちなみにBCC Developerを使っています)
「プロジェクトの設定」-「アプリケーション」-「ターゲット」をコンソールアプリケーションにしたところ
Error: 外部シンボル '_main' が未解決
と出てしまい、
Windowsアプリケーションとしたところ、
Error: 外部シンボル '_img_player_shot' が未解決
Error: 外部シンボル '_PlayerShot' が未解決
と出てしまいました。
過去ログを見て、externをWinmain外に出しても何ら変化がありませんでした。
改善すべき点と、アプリケーションの使い分け方を教えていただけないでしょうか?
よろしくお願いします。
シューティングゲームの館の第8節にて、サンプルをコピペしてプログラムを実行してみたところ、エラーが発生しました。(ちなみにBCC Developerを使っています)
「プロジェクトの設定」-「アプリケーション」-「ターゲット」をコンソールアプリケーションにしたところ
Error: 外部シンボル '_main' が未解決
と出てしまい、
Windowsアプリケーションとしたところ、
Error: 外部シンボル '_img_player_shot' が未解決
Error: 外部シンボル '_PlayerShot' が未解決
と出てしまいました。
過去ログを見て、externをWinmain外に出しても何ら変化がありませんでした。
改善すべき点と、アプリケーションの使い分け方を教えていただけないでしょうか?
よろしくお願いします。