小数の桁数を指定した切捨ての仕方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たか

小数の桁数を指定した切捨ての仕方

#1

投稿記事 by たか » 17年前

こんにちは、いかについて質問です。

double aaa = 123.456779874243753

上記のaaaを小数点第6位以下を切捨てる。

結果 123.45677

上記方法を教えてください。
環境はvisual studio 2005 .net です。

以下は試したところ誤差が出てしまったので、できれば誤差の出ない切捨て方法をお願いします。

long box = aaa * 100000;
aaa = box / 100000;

組木紙織

Re:小数の桁数を指定した切捨ての仕方

#2

投稿記事 by 組木紙織 » 17年前

質問1:
 言語はcですか?c++ですか?
質問2:
 切り捨てした結果はどうするのですか?(変数に代入するとか、表示するとか)

たかぎ

Re:小数の桁数を指定した切捨ての仕方

#3

投稿記事 by たかぎ » 17年前

> 誤差が出てしまったので

この場合は「誤差」とはいわないような...
long box = aaa * 100000; 
aaa = box / 100000;
で多少はましになりますが、誤差が全くなくなるわけではありません。

10進法で表現して誤差がないようにするには、BCD演算でも行うとか、文字列で扱うとかしないとダメです。

たかぎ

Re:小数の桁数を指定した切捨ての仕方

#4

投稿記事 by たかぎ » 17年前

すみません。コピペのミスです。
long box = aaa * 100000; 
aaa = box / 100000.0;
でましになります。

たか

Re:小数の桁数を指定した切捨ての仕方

#5

投稿記事 by たか » 17年前

質問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

うまく伝えられなくすいません。

組木紙織

Re:小数の桁数を指定した切捨ての仕方

#6

投稿記事 by 組木紙織 » 17年前

つまり
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:小数の桁数を指定した切捨ての仕方

#7

投稿記事 by バグ » 17年前

あら?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:小数の桁数を指定した切捨ての仕方

#8

投稿記事 by たか » 17年前

サンプル回答ありがとうございます。

参考にした結果ですが
小数点位置を戻す前にあらかじめ
小さな数を足してから処理するようにしました。

ret += 0.0000005;
ret /= 100000.0;

■ret = 123.45678000000500(ウォッチウインドウ表示)

ご協力ありがとうございました。

バグ

Re:小数の桁数を指定した切捨ての仕方

#9

投稿記事 by バグ » 17年前

それだと『切捨て』ではなくて、『四捨五入』もしくは『繰上げ』になってしまいませんか?

ぬっち

外部シンボルが未解決?

#10

投稿記事 by ぬっち » 17年前

こんばんは、また詰まってしまったので質問させていただきますm(--)m

シューティングゲームの館の第8節にて、サンプルをコピペしてプログラムを実行してみたところ、エラーが発生しました。(ちなみにBCC Developerを使っています)
「プロジェクトの設定」-「アプリケーション」-「ターゲット」をコンソールアプリケーションにしたところ
Error: 外部シンボル '_main' が未解決
と出てしまい、
Windowsアプリケーションとしたところ、
Error: 外部シンボル '_img_player_shot' が未解決
Error: 外部シンボル '_PlayerShot' が未解決
と出てしまいました。

過去ログを見て、externをWinmain外に出しても何ら変化がありませんでした。
改善すべき点と、アプリケーションの使い分け方を教えていただけないでしょうか?

よろしくお願いします。

バグ

Re:外部シンボルが未解決?

#11

投稿記事 by バグ » 17年前

コンソールアプリケーションを指定したのならば、Winmain関数ではなく、main関数を使用して下さい。

ぬっち

Re:外部シンボルが未解決?

#12

投稿記事 by ぬっち » 17年前

バグさん返答ありがとうございます。

無事解決しました^^

閉鎖

“C言語何でも質問掲示板” へ戻る