web-dev-qa-db-ja.com

MySQLデータベースのカラムで可能な最大のdouble / float

PHPアプリケーションを開発しています。このアプリケーションでは、100万を超える値を格納する必要がありますが、浮動小数点を柔軟に使用できます。従来のfloatとdoubleを知っています。小数点以下2桁までを格納し、小数点以下2桁のみの数値を持つ演算のみを処理します。

私は自分の列タイプをdoubleおよびunsignedに選択しましたが、100万より大きい値を持つ行を保管すると、常に999999.99に切り捨てられます

どうしてこれなの?適切なデータタイプ/ソリューションを探しています。正しい方向に向けていただければ幸いです。

よろしくお願いします!

乾杯。

2
idelara

FLOATまたはDOUBLEの最後に_(m,n)_を使用しないでください。これにより、丸め(下部)または切り捨て(上部)が発生します。 _(m,n)_が必要な場合、おそらくDECIMAL(m,n)を使用する必要があります。

FLOATは24の有効なbitsデータ(約7桁の10進数に相当; storage = 4バイト)を格納し、指数は約10 ** +/- 38の範囲です。

DOUBLEは53ビット(約16桁、8バイト)を格納し、その範囲は非常に広いです。

あなたの質問は曖昧です-「お金」を保管していますか?もしそうなら、あなたは本当にそうするべきですDECIMAL(m,2)を使用します。 m = 8は最大 100万ドル(またはユーロなど)を保存できます。ただし、mは必要なだけ大きくすることができます。 (数値がどれほど大きいかを確認する前に、2を差し引くことを忘れないでください。)_(14,2)_は、1兆ドルまでの精度で、1兆ドルを格納します。 8バイトのストレージが必要です。

5
Rick James

CPUが浮動小数点数を処理する方法が原因で、浮動小数点数が常に希望どおりに格納されるわけではありません

常に2つの小数点がある数値を格納する場合は、整数として格納し、プレゼンテーションレイヤーに小数点を追加します。

1
Philᵀᴹ