6

を挿入すると、その値を選択したときDOUBLEのように値が表示されるのはなぜですか? 代わり9.755046187483832e17にどのように数値を取得できますか?975504618748383289

4

2 に答える 2

7

FORMATおそらくorROUND関数を探しているでしょう:

を使用FORMAT()すると、ロケールと特定のニーズに応じて、 3 桁ごとの区切り文字を置き換える必要がある場合があります。

mysql> SELECT FORMAT(9.755046187483832e17,0);
975,504,618,748,383,200

mysql> SELECT REPLACE(FORMAT(9.755046187483832e17,0), ',','');
975504618748383200

一方、数値関数であるため、数字のみを出力ROUND()ます

mysql> SELECT ROUND(9.755046187483832e17,0);
975504618748383200

それを試すには、 http://sqlfiddle.com/#!2/d41d8/17614を参照してください。


編集:お気づきのとおり、最後の 2 桁は00に丸められます。それは、DOUBLE精度の限界のためです。doubleおおよそであることを覚えておく必要があります。正確な値や倍精度の 16 ビット精度で使用できるよりも多くの桁数が必要な場合は、おそらく列の型を に変更する必要がありますDECIMAL。デフォルトでDECIMALは、10 桁の精度 (10を底とする 10桁) です。最大 65 桁まで明示的に要求できます。

たとえば、最大 20 桁の精度が必要な場合は、次のように記述します。

CREATE TABLE tbl (myValue DECIMAL(20), ...

http://dev.mysql.com/doc/refman/5.6/en/fixed-point-types.htmlを参照してください。

ただし、物事はそれほど単純ではないことに注意してください。10 進数の列を選択すると、サイレントにdouble (またはbigint ?) に変換される可能性があるため、余分な精度が失われます。完全な精度を維持するために、明示的に文字列にキャストする必要がある場合があります。つまり、アプリケーション レベルで対処する必要がある場合があります。

create table tbl (dblValue DOUBLE, decValue DECIMAL(20,0));
insert into tbl values (975504618748383289, 975504618748383289);

SELECT dblValue, decValue FROM tbl;
--> DBLVALUE            DECVALUE
--> 975504618748383200  975504618748383200

SELECT CAST(dblValue AS CHAR), CAST(decValue AS CHAR) FROM tbl;
--> CAST(DBLVALUE AS CHAR)  CAST(DECVALUE AS CHAR)
--> 9.755046187483832e17    975504618748383289

例については、 http://sqlfiddle.com/#!2/d5f58/2を参照してください。

于 2013-08-03T18:49:44.713 に答える
0

double の精度は約 16 桁です。さらに精度が必要な場合は、2 つのオプションがあります。

値が整数の場合、bigint最大約 19 桁の精度を使用できます。

より良いのはdecimal、最大 65 桁をサポートするものです。たとえば、次はエラーを返します。

select format(v*v*v*v*v*v*v*v, 0)
from (select 1001 as v) t

の値がvとして扱われるためbigintです。

ただし、以下は非常にうまく機能します。

select format(v*v*v*v*v*v*v*v, 0)
from (select cast(1001 as decimal(65, 0)) as v) t

戻る1,008,028,056,070,056,028,008,001- これが正確な答えです。

65 桁までの精度が必要な場合は、 を使用しますdecimal。さらに、独自のルーチンを作成する必要がある場合もあります。フィールドで演算を行っていない場合は、文字列として格納することを検討してください。

于 2013-08-03T19:45:19.497 に答える