PHPアプリケーションを開発しています。このアプリケーションでは、100万を超える値を格納する必要がありますが、浮動小数点を柔軟に使用できます。従来のfloatとdoubleを知っています。小数点以下2桁までを格納し、小数点以下2桁のみの数値を持つ演算のみを処理します。
私は自分の列タイプをdoubleおよびunsignedに選択しましたが、100万より大きい値を持つ行を保管すると、常に999999.99に切り捨てられます
どうしてこれなの?適切なデータタイプ/ソリューションを探しています。正しい方向に向けていただければ幸いです。
よろしくお願いします!
乾杯。
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バイトのストレージが必要です。
CPUが浮動小数点数を処理する方法が原因で、浮動小数点数が常に希望どおりに格納されるわけではありません 。
常に2つの小数点がある数値を格納する場合は、整数として格納し、プレゼンテーションレイヤーに小数点を追加します。