61395


和、差、積、商を求めるプログラムについて。

それぞれvoidで値の格納して、main関数によって答えを入出力したいのですが、商の答えが小数点以下で切り捨てられてしまいます。

shouの部分はdoubleで格納し、特に変な点はないと思ったのですが、下記のように小数点以下を切り捨てた状態で出力されてしまいます。

13/2=6.500000と出力させるにはどこを直したらよいのでしょうか。

* * *

**ソースコード**

[code]

    void  fouroperation(int n1, int n2, int *wa, int *sa, int *seki, double *shou)
    {
        *wa=n1+n2;
        *sa=n1-n2;
        *seki=n1*n2;
        *shou=n1/n2;
    }
    
    int main(void)
    {
        int n1,n2,wa,sa,seki;
        double shou;
        printf("Input n1: ");
        scanf("%d",&n1);
        printf("Input n2: ");
        scanf("%d",&n2);
    
        fouroperation(n1,n2,&wa,&sa,&seki,&shou);
    
        printf("%d+%d=%d\n",n1,n2,wa);
        printf("%d*%d=%d\n",n1,n2,seki);
        printf("%d-%d=%d\n",n1,n2,sa);
        printf("%d/%d=%f\n",n1,n2,shou);
    
        return 0;
    }
    
[/code]

**実行結果**

[code]

    $ ./a.out
    Input n1: 13
    Input n2: 2
    13+2=15
    13*2=26
    13-2=11
    13/2=6.000000
    
[/code]


CC BY-SA 4.0
2019-12-12T12:11:35.990
61384
2019-12-13T03:21:05.437
2019-12-13T03:07:04.830
3060
36412
question
c
商の計算結果で少数部分が切り捨てされてしまう


商がどのように計算されるかは、計算結果が格納される変数の型ではなく、計算される側の変数の型で変わります。今回の場合、int と int の商が int
として計算され、その後 double にキャストされ代入されています。本当にしたいのは商を double として計算することです。

たとえば：

[code]

    int a = 13;
    int b = 2;
    printf("%d\n", a/b);                     // 6
    printf("%lf\n", (double)(a / b));        // 6.000000
    printf("%lf\n", ((double)a) / b);        // 6.500000
    printf("%lf\n", a / (double)b);          // 6.500000
    printf("%lf\n", (double)a / (double)b);  // 6.500000
    
[/code]


CC BY-SA 4.0
2019-12-12T12:28:24.693
61386
2019-12-12T12:28:24.693
19110
61384
answer


[c](/questions/tagged/c "'c' のタグが付いた質問を表示") の言語仕様によって

  * `int / int` の結果は `int` ([c99](/questions/tagged/c99 "'c99' のタグが付いた質問を表示") 以後なら商は `0` 方向に切り捨て)
  * `double / double` の結果は `double`
  * `int / double` または `double / int` は式の両辺の型を揃えて上記 (この場合 `int` → `double` の暗黙変換を行う) 

と決まっています。

  * 提示コード `*shou=n1/n2;` は演算子の結合順から `*shou=(n1/n2);` となり
  * `n1/n2` はその両辺が `int` なので最初の規定に従い結果は `int`
  * 代入の際に `int` → `double` の暗黙の型変換が行われる。

なので質問にある通りの結果となります。で、どう直すかは既に回答アリ。

* * *

「キャスト」という用語は、言語仕様書的には「明示的な型変換」限定なので、「暗黙の型変換」は含まれません。

`double quotient = (double)n1 / n2;` という式文があるとき  
\- `(double)n1` はキャスト  
\- `n2` は暗黙の型変換で `int` → `double` に昇格 (promotion)  
と呼ぶのが厳密ですが、まあ最初はこんな細かいことはキニシナイ。


CC BY-SA 4.0
2019-12-13T00:27:20.727
61391
2019-12-13T00:27:20.727
8589
61384
answer


これで大丈夫だと思います。

[code]

    void  fouroperation(int n1, int n2, int *wa, int *sa, int *seki, double *shou)
    {
        *wa=n1+n2;
        *sa=n1-n2;
        *seki=n1*n2;
        *shou=(double)n1/(double)n2;
    }
    
[/code]


CC BY-SA 4.0
2019-12-13T03:21:05.437
61395
2019-12-13T03:21:05.437
24490
61384
answer