アプリ版:「スタンプのみでお礼する」機能のリリースについて

仮に double 型 の ある数字を 12.6 とします。

printf関数を使って .0f で表示する時は 小数点を四捨五入されて 、整数地が1繰り上がり13と表示されます。

ここである数字をキャスト演算子を使ってprintfで表示すると小数点を切り捨てられるので12と表示されます。

これはdouble型では 12.6 がはいっていて int型では12がはいっているから起こる現象ですね。

前置きは長く長くなりましたがdouble型で四捨五入される数字を、int型にした時に1繰り上げる簡単な方法はないものでしょうか?

 double a = 12.6;
 int b = ( int ) a;

 if( a - ( double ) b  > 0.4444444444 ){
  b++;
 }

 printf( "%d\n" , b );

こういう方法なら一応出来ない事はないですがもっと簡単な方法はありませんか?


後、私は時間が余りないので時間内に回答がなければ返信が来週になります。
申し訳ありません。
答えていただいた方はありがとうございます。

A 回答 (6件)

+0.5してからintにする。


常套手段です。

> if( a - ( double ) b  > 0.4444444444 ){

>= 0.5 でしょう。
これだと、 12.45 → 13 になります。
0.499999999 でも、誤差の関係で微妙です

この回答への補足

なるほどそういう方法常套手段としてあるのですね

教えていただきありがとうございました
時間がなくて全員に返信できづにすみません

皆様ありがとうございました

補足日時:2013/07/02 07:51
    • good
    • 0

四捨五入というか、まるめというか、目的によって使い分ける必要があります。


(1) 経済学的な分野では、負の値はマイナス方向に四捨五入した方が実感として良いと思います。
例えば、4.51万円の借金、つまりは-4.51万円は四捨五入によって-5万円にした方が-4万円にするよりも実感として良いわけです。
(2) 画像処理のような分野では、見た目が自然になる方が良いわけです。
例えば、x1=4.5とx2=-4.5の距離は実際には4.5-(-4.5)=9.0です。でも四捨五入によってx1=5、x2=-5にしてしまうと、計算上5-(-5)=10になってしまいます。この場合は-4.5は四捨五入によって-4にした方が距離は保たれて見た目に自然な結果になります。つまりこの場合はプラス方向に四捨五入することになります。
従って負の値をプラス、マイナスのどちら方向に四捨五入するかは分野によって使い分ける必要が出てきます。
    • good
    • 0

>if( a - ( double ) b  > 0.4444444444 ){



なぜ0.4444444444を使っているのか根拠が不明です。
根本的な解決策になっていません。
    • good
    • 0

四捨五入にはround関数を使います。

    • good
    • 0

double 型のある数字が、



正のときは、+0.5 してから int にキャストする。
負のときは、-0.5 してから int にキャストする。

a += ( a < 0.0 ) ?-0.5 : 0.5;

printf( "%d\n", (int)a );
    • good
    • 1

四捨五入は


(int)(a+0.5)

でいいですよ。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!