質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

3029閲覧

MySQL Double型に1をInsertすると0.9になる

Qoo

総合スコア1249

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

1グッド

0クリップ

投稿2017/03/01 03:29

表題の通りですが、下記のSQLで数字の1をInsertし、phpadminで確認するとなぜか0.9という数字が入っています。

insert into table_test (volume) values(1)

1.0が入るものと考えているのですが、なぜ0.9になるのかわかりません。

定義上は volume double(1,1) not null としています。

take88👍を押しています

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

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

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

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

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

guest

回答4

0

double(1,1)だと、有効な桁数が1桁で小数点以下が1桁、つまり小数部分だけ1桁保持できるが整数部分は保持できない、ということになってしまいます。
そのため、1のようにdouble(1,1)で表現できない値をinsertすると、表現できる範囲(-0.9~0.9)に丸められてしまうのでしょう。

double(2,1)などとするのが良いかと思います。

投稿2017/03/01 03:39

編集2017/03/01 03:40
alg

総合スコア2019

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

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

Qoo

2017/03/01 03:53

ありがとうございます!
guest

0

ベストアンサー

そもそも double(1,1) だと、小数点以下第1位しか保持できません。(全体で1桁、うち小数点以下1桁なので、整数部がない)
ですから 0.9 になるのでは。

※でも insert into table_test (volume) values (1) がエラーになるはずですが

投稿2017/03/01 03:43

tacsheaven

総合スコア13703

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

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

alg

2017/03/01 03:46

MySQL(というかMariaDB)で試してみたところ、`insert into table_test (volume) values (1)`はエラーにはなりませんでした。 MySQLはこのあたり良くも悪くも柔軟ですね。
Qoo

2017/03/01 03:53

ありがとうございます!
tacsheaven

2017/03/01 03:55 編集

うーん、Windows 上の MySQL 5.5 で試したのですが、エラーになりますね。 Error Code: 1264. Out of range value for column 'volume' at row 1 5.5 以後、暗黙の CAST がごっそり変更されたから、それが影響しているのかも。
alg

2017/03/01 04:07

おお、そうなんですか。私が確認した環境(https://www.tutorialspoint.com/mysql_terminal_online.php)は MariaDB 10.0.23 でした。MariaDB 10.0 で MySQL 5.6で追加になった機能をバックポートしたらしいので、そのあたりが絡むのでしょうかね。あるいは何らかの設定による?
guest

0

double(1,1) で定義した意図は?

MySQL 5.6 リファレンスマニュアル 数値型の概要

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

...
M は桁数の合計で、D は小数点以下の桁数です。

投稿2017/03/01 03:46

Orlofsky

総合スコア16415

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

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

Qoo

2017/03/01 03:53

ありがとうございます!
Orlofsky

2017/03/01 10:20

Oracleですと、当然 >ORA-01438: この列に許容される指定精度より大きな値です ってエラーになってINSERTが失敗します。 MySQLですと、テーブル設計時に十分な桁数を確保しておきましょうね。
guest

0

double(m,n)は全体の桁数がmで小数点以下の桁数がnです
なので1,1で入れられる最大の数値は0.9になります。
1.0が欲しければ最低でも2,1としてください

投稿2017/03/01 03:43

yambejp

総合スコア114839

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

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

Qoo

2017/03/01 03:52

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問