• ベストアンサー

INT型は金額の型に使用するべきでない?

金額を格納する属性のデータ型をINT型(UNSIGNED)にして設計していましたが、MySQLのマニュアルを見ると、金額の型にはDECIMALを使用すべきとあります。なぜINT型ではいけないのでしょうか? よろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

いけないわけではなくて望ましいとの事でしょう。 たとえば100g 98.5円の牛肉があった場合は200gで197円です。 INT型だと98.5円は98円か99円でしか表現できません。 その他にも999円の30%OFFだと699.3円です。 整数型のINTだと小数点以下が表現できないのでDECIMAL型の方が望ましいとの事でしょう。

dalianse
質問者

お礼

なるほど、では小数点以下がない金額しか扱わない場合は別にINTでも問題ないわけですね。 ありがとうございました。

その他の回答 (1)

回答No.2

小数点以下の値(何円何銭など)は扱わないのですか? INTなどの2進数表現の場合、小数点以下の精度を十分に保てません。

dalianse
質問者

お礼

小数点以下は使わないですね。 その場合は別に問題なさそうですね。 ありがとうございました。

関連するQ&A

  • unsigned int型と int型の型変換の上位性

    if(-10<1u)の条件判定はunsigned型で評価され偽となります。 int型 unsigned int型とも32ビットで考えたとき、 1u = 0x00000001 -10 = 0xfffffff6で10進法では4294967286になります。 条件判定をunsigned型で考えれば確かに-10<1uは偽になり int型で考えれば-10<1uは真になります。 「通常の算術変換」によれば、「一方のオペランドがunsigned int型をもつ時、他のオペランドをunsigned int型に型変換するとあります。」 よって、if(-10<1u)の条件判定はunsigned型で評価され偽となりますが、 「一方のオペランドがint型をもつ時、他のオペランドをint型に型変換する。」では何故いけないのでしょうか? 宜しく願います。

  • C言語の型変換(int~short)について

    Renesas HEWで、平均値を求める下記の様なプログラムを書いています。 unsigned short data[100] ; unsigned int total ; unsigend short avg_short ; unsigend int avg_int ; for (i=0; i<100 ; i++) {total += data[100];} avg_short = (short) (total / 100) ; avg_int = total / 100 ; とした場合、avg_intには、平均値が32bit(上位16bit=0)で格納されますが、 avg_shortは、0 が格納されます。 avg_intの下位16bitだけを格納するには、どうしたらよいのでしょうか?

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • int→unsigned int キャスト

    int test01; unsigned test02; の場合、test02にtest01の値を代入したい場合どうすればよいでしょうか? 型は変更できません。 キャストして代入しても大丈夫でしょうか?

  • シフト演算の結果の型

    シフト演算の結果の型は、左オペランドの型ということを聞きました。 この左オペランドの型というのは算術型変換をしてからのか、する前の型なのかどちらなのでしょうか? 例えば int a = -2; unsigned int b = 1; a >> b このときの結果の型は何になるのでしょうか? 算術型変換が起きる前のintになるのか? それとも算術型変換が起きるた後のunsigned intになるのか? 例文としてはおかしい点もあるかもしれませんが よろしくお願いします。

  • #defineでの型定義について

    typedefと同様に#defineでも型定義できると聞いて行いましたがコンパイルエラーが出てうまくいきませんでした。どうすればいいでしょうか? typedef unsigned int Unit //OK #deifine Unit unsigned int //NG

  • 「000-000」のような値を扱いたい時の型。

    例えば整数「123」などでしたら、int型を使って値を格納すればいいと思うのですが、例えば「123-999」などを扱いたい場合は、どんな型を使うべきでしょうか?やはり文字列型になってしまうでしょうか? 数字以外には「-(あるいは_)」しか使いません。 それらの値をデータベース(MySQL)に入れる予定です。 それらの値はデータベースのID(キー)に使います。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Long Int と Int の使い分けは

     今晩は、Cの初心者です、宜しくお願いします。  データーの型で、IntとLong Intがあっていどちらも4Bytesで扱えるデーターの範囲も同じなのですが、 Long Intはどのようなときに使うのでしょうか。

  • strchr() の第2引数はなぜ int 型なのでしょうか

    もしかすると、ちょい前の質問(https://okauth.okwave.jp/qa4151232.html)と同じことを聞いているような気もしますが、気にせずポスト。 その質問を読んだ時に strchr() のマニュアルを見たわけなんですが、そのプロトタイプ宣言は char* strchr(const char* s, int c); なんですね。どうして第 2 引数の型が int なのでしょう?「文字」c を検索するんだから普通に考えれば char ではないかと思うのですが、誰か教えて下さい。 ソースはこんな感じだったので、int である必要はないように思えるのですがどうなんでしょうか? 負数を与えたときに「何らかの動作」を期待してのことなのでしょうか? char* strchr(const char* s, int c) {  char ch;  ch = c; /* <= 結局 char 型にしている */  for ( ; ; ++s) {   if ( *s == ch ) {    return (char*)s;   }   if ( *s == '\0' ) {    return NULL;   }  } }

  • C言語の型変換について

    short int 型をunsigned char型に変換する方法をおしえてください