🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3390閲覧

c++における小数点の計算

ilovearchlinux

総合スコア15

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/03/08 10:37

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int n; 6 cin >> n; 7 8 double tax = 1.08; 9 double x = n/tax; 10 11 cout << x << endl; 12 13 double y = x*2.0; 14 double z = x*tax; 15 16 cout << y << endl; 17 cout << floor(y) << endl; 18 cout << z << endl; 19 cout << floor(z) << endl; 20}

結果(nを1079とした場合):

999.074 1998.15 1998 1079 1079

何故2.0を掛けた場合は小数以下も計算でき且つ切り捨て出来ているのに、999.074*1.08=1078.999...の場合は出力は愚か1078と小数第一位で切り捨てされないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

浮動小数点の表示方法には、
固定小数点表記(fixed) と指数表記(scientific) があります。
初期状態は defaultfloat になっていて、表示が短くなるほうが自動的に
選択されますが、小数点以下で末尾の連続する 0 は表示されません。

また精度(precision) の値の初期値は 6 で、
fixed や scientific の場合、これは小数点以下の表示桁数になります。
defaultfloat の場合、これは有効数字の桁数になります。

固定小数点で、小数点以下12桁表示にしてみると、

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() 5{ 6 int n = 1079; 7 8 cout << fixed << setprecision(12); 9 double tax = 1.08; 10 cout << "tax = " << tax << endl; 11 double x = n/tax; 12 13 cout << "x = " << x << endl; 14 15 double y = x*2.0; 16 double z = x*tax; 17 18 cout << "y = " << y << endl; 19 cout << "floor(y) = " << floor(y) << endl; 20 cout << "z = " << z << endl; 21 cout << "floor(z) = " << floor(z) << endl; 22}

実行結果

text

1tax = 1.080000000000 2x = 999.074074074074 3y = 1998.148148148148 4floor(y) = 1998.000000000000 5z = 1079.000000000000 6floor(z) = 1079.000000000000

cout << fixed << setprecision(12);
cout << scientific << setprecision(12); に変更して、
指数表記で小数点以下12桁表示にしてみると、

text

1tax = 1.080000000000e+00 2x = 9.990740740741e+02 3y = 1.998148148148e+03 4floor(y) = 1.998000000000e+03 5z = 1.079000000000e+03 6floor(z) = 1.079000000000e+03

追記
cout << fixed << setprecision(12);
cout << defaultfloat << setprecision(12); に変更して、
有効桁数12で表示してみると

text

1tax = 1.08 2x = 999.074074074 3y = 1998.14814815 4floor(y) = 1998 5z = 1079 6floor(z) = 1079

小数点以下の 0 が消えています。

投稿2021/03/08 12:39

編集2021/03/08 16:56
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

有効数値を超える部分の計算誤差は、切り捨てられるとは限りません。切り上げられる場合もあります。

投稿2021/03/08 12:29

otn

総合スコア85882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一般的なコンピューターの浮動小数点数は、1の位以下も2進法で計算するようになっていて、1.08も厳密に正しい値を表せません。

なので、端数が出ることを前提に演算を組み立てる必要があります。

投稿2021/03/08 11:04

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問