web-dev-qa-db-ja.com

非指数形式でdoubleデータ型の値を取得します

doubleデータ型の列で非指数値を取得することは可能ですか?列の幅が15に増加すると、値が指数形式で表示されます。

今、私は以下を取得します:

mysql> create table abc(a int,b double) engine innodb;
mysql> insert into abcd values(10,123456789123456789123456789);

mysql> select * from abc;
+------+-----------------------+
| a    | b                     |
+------+-----------------------+
|   10 | 1.2345678912345679e26 |
+------+-----------------------+

これの代わりに、mysqlクライアントで123456789123456789123456789として入力した形式で表示する必要があります。

2
Yogesh Ballani

倍精度浮動小数点値 は、精度を失うことなく数値123456789123456789123456789を含むことができないため、実行しようとしていることを正確に実行することはできません。

"double"はメモリの 8バイトで格納 であり、MySQLではなく、 "double"の性質により、約15桁の精度に制限されています。

上記の挿入を実行すると、実際には1.2345678912345679 x 10 ^ 26 ...が格納されているため、MySQLは実際に値を正しく返します。

数値を元のformatに強制的に戻すことは可能ですが、正確な元のvalue正確な値を保存していなかったため 。それを十分に大きいDECIMAL値にキャストしてから、DECIMALをCHARにキャストします。

SELECT CAST(CAST(b AS DECIMAL(30)) AS CHAR) FROM abcd;

返される値は123457890123456790000000000 ...です。これはフィールドに格納されているものだからです(見た目は逆ですが)正しいですが、その形式で表現された値は不正確な精度を与えます...これがおそらく理由ですそもそも指数表記で返されています。

精度が必要な場合は、これらの値をDOUBLEではなくDECIMAL列に格納します。

1