mysql:16131
From: "yoku ts." <"yoku ts." <yoku0825@xxxxxxxxxx>>
Date: Mon, 9 Jun 2014 10:31:33 +0900
Subject: [mysql 16131] Re: [mysql 16130] Re: [mysql 16129] Re: [mysql 16128] MySQLのfloat型の有効桁数について
こんにちは、yoku0825といいます。 float型の…という件名だったのでfloat型な返信をしましたが、 なんらかの理由でこだわりがあるというわけで *ないのであれば* DECIMAL型の方が良いと思います。 mysql56> CREATE TABLE t1 (num decimal(32, 20)); Query OK, 0 rows affected (0.05 sec) mysql56> INSERT INTO t1 VALUES (1.2345678901234567890); Query OK, 1 row affected (0.00 sec) mysql56> SELECT * FROM t1; +------------------------+ | num | +------------------------+ | 1.23456789012345678900 | +------------------------+ 1 row in set (0.00 sec) こちらの方が、丸め誤差もありませんし。 yoku0825 2014年6月9日 0:38 ktsa5236@xxxxxxxxxx <ktsa5236@xxxxxxxxxx>: > yoku0825さん > > お返事遅くなりまして、申し訳ございません。 > > ご回答、有難うございます。 > 確かに7桁は保存はされているようですね。 > > yoku0825さんのテーブルでround()関数を使って、もう少し試してみました。 > > mysql> SELECT num, ROUND(num,5),ROUND(num,6),ROUND(num,7) ,ROUND(num,8) > ,ROUND(num,9),ROUND(num,13) from t1; > +--+--+--+--+--+--+--+ > | num | ROUND(num,5) | ROUND(num,6) | ROUND(num,7) | ROUND(num,8) | > ROUND(num,9) | ROUND(num,13) | > +--+--+--+--+--+--+--+ > | 1.23457 | 1.23457 | 1.234568 | 1.2345679 | 1.23456788 | 1.234567881 | > 1.2345678806305 | > +--+--+--+--+--+--+--+ > 1 row in set > > アプリ側では、長めの第2引数のround()関数で逃げておけば良さそうですね。 > > 有難うございました。 > > > > 2014年6月3日 11:10 yoku ts. <yoku0825@xxxxxxxxxx>: > > こんにちは、yoku0825といいます。 >> >> 内部的にはCのfloatを使っているので、格納はされているけれど丸められているんだと思います。 >> (↓5.6ですが) >> >> mysql56> CREATE TABLE t1 (num float not null, num_20 float(20, 16)); >> Query OK, 0 rows affected (0.05 sec) >> >> mysql56> INSERT INTO t1 VALUES (1.2345678901234567890, >> 1.2345678901234567890); >> Query OK, 1 row affected (0.01 sec) >> >> mysql56> SELECT * FROM t1; >> +---------+--------------------+ >> | num | num_20 | >> +---------+--------------------+ >> | 1.23457 | 1.2345678806304932 | >> +---------+--------------------+ >> 1 row in set (0.00 sec) >> >> mysql56> SELECT num* 10000, num_20* 10000 FROM t1; >> +--------------------+------------------------+ >> | num* 10000 | num_20* 10000 | >> +--------------------+------------------------+ >> | 12345.678806304932 | 12345.6788063049320000 | >> +--------------------+------------------------+ >> 1 row in set (0.00 sec) >> >> 掛け算で値が狂うのは、浮動小数点数なのでご愛嬌(?) >> 表示桁数の制御はこのあたりですかね。。 >> >> http://dev.mysql.com/doc/refman/5.6/en/floating-point-types.html >> >> >> yoku0825 >> >> >> 2014年6月3日 10:38 ktsa5236@xxxxxxxxxx <ktsa5236@xxxxxxxxxx>: >> >> いつもお世話になっております。ktsaと申します。 >>> 表題の件について教えていただきたいのですが、 >>> MySQLのfloat型は、IEEE754に則っているのでしょうか? >>> 7桁ではなく、常に有効数字6桁までしか保存されないように思います。 >>> >>> 環境とテスト内容ですが、 >>> MySQL5.0.22-community-nt >>> >>> データベースはInnoDB >>> >>> CREATE TABLE `testtb` ( >>> `A` tinyint(4) NOT NULL default '0', >>> `B_dbl` double default NULL, >>> `C_float` float default NULL, >>> PRIMARY KEY (`A`) >>> ) ENGINE=InnoDB DEFAULT CHARSET=sjis; >>> >>> Insert into testtb >>> values(11,1.2345678901234567890,1.2345678901234567890); >>> >>> を実行する。 >>> コンソール実行画面結果は、 >>> >>> mysql> Insert into testtb >>> values(11,1.2345678901234567890,1.2345678901234567890); >>> Query OK, 1 row affected >>> >>> mysql> select * from testtb where A=11; >>> +----+------------------+---------+ >>> | A | B_dbl | C_float | >>> +----+------------------+---------+ >>> | 11 | 1.23456789012346 | 1.23457 | >>> +----+------------------+---------+ >>> 1 row in set >>> とC_float列は7桁目が丸めまれ常に有効数字が6桁になります。 >>> 他の値でも試しましたが同様でした。 >>> >>> よろしくお願いいたします。 >>> >> >> >
@ 16128 2014-06-03 10:38 ["ktsa5236@xxxxxxxxxx] MySQLのfloat型の有効桁数について @ 16129 2014-06-03 11:10 ┗["yoku ts." <yoku0825] Re: [mysql 16128] MySQLのfloat型の有効桁数について @ 16130 2014-06-09 00:38 ┗["ktsa5236@xxxxxxxxxx] Re: [mysql 16129] Re: [mysql 16128] MySQLのfloat型の有効桁数について -> @ 16131 2014-06-09 10:31 ┗["yoku ts." <yoku0825] Re: [mysql 16130] Re: [mysql 16129] Re: [mysql 16128] MySQLのfloat型の有効桁数について @ 16132 2014-06-11 11:37 ┗["ktsa5236@xxxxxxxxxx] Re: [mysql 16131] Re: [mysql 16130] Re: [mysql 16129] Re: [mysql 16128] MySQLのfloat型の有効桁数について