2017-10-26 4 views
1

私はLaravelの移行システムを使用して、既存のデータベース構造を再作成しています。テーブルは、この既存のデータベース内のテーブルと正確に一致する必要があります。マイグレーション時にfloatで倍精度ではないフィールドを作成するにはどうすればよいですか?

テーブル上のフィールドの1つがそのようにと記載されている:

Laravelの移行のドキュメントを見てみると
`frequency` float unsigned NOT NULL DEFAULT 0, 

私は、次のオプションを参照してください。

$table->float('amount', 8, 2); 
$table->double('column', 15, 8); 

これらの列型の結果の両方を作成します長さと小数点を含むdoubleタイプの列。しかし、具体的に定義された長さと小数点ゼロのfloatと定義されているものが必要です。

Laravelの移行システムを使用することは可能ですか?

+0

[documentation](https://laravel.com/docs/) 5.5/migrations#creating-tables)$ table-> float()はfloatフィールドを作成します。 Laravel/MySQLのどのバージョンを使用していますか? – McGo

+1

小数点はありません。それは整数ではないでしょうか?ちなみに小数点以下のオプションもありますが、これは2倍より少し正確です。 – aynber

+0

私は最新のLaravel Homestead Vagrantインスタンスを使用しています。MySQLのバージョンは '5.7.19-0ubuntu0.16.04.1'です。これはバグですか? ' - > float( 'whatever')は間違いなく' double'カラムを作成しているからです。 –

答えて

0

FLOATやMySQLでDOUBLEない使用(m,n)を行います。この機能はDECIMALにのみ属します。小数点以下の桁数をゼロにしたい場合は、INTという形式を使用します。一方、おそらくあなたのfrequencyはギガヘルツですか?どの時点でFLOATの精度または小数点なしが最も適切です。

1GHzはFLOAT(8,2)に収まらないが、FLOATに収まることに注意してください。

なぜ両方ですか... FLOATは4バイトをとります。 DOUBLEは8をとります。両方ともIEEE-754標準の一部であり、ほとんどすべてのコンピュータハードウェアが実装しています。 「古い」時代(1MBのRAMが「大きな」マシンで、80年代初めの標準である)、4バイトを節約することは大きな問題でした。 Laravelが浮動小数点を二重に変えているなら、それはその選択です。 MySQLもどちらかを採用します。

事実上すべての状況で、FLOATDOUBLEの値と変数は同じ意味を持ちます。 ただし、 ... FLOATに格納されている値と同じ値がDOUBLEに格納されていると、値が等しくない場合があります。例えば、float(1.234)!=ほぼすべての言語、ハードウェアなどでdouble(1.234)

MySQLはfrequency float unsigned NOT NULL DEFAULT 0に満足しています。

しかし、Laravelの$table->float('amount', 8, 2);がMySQLのFLOAT(8,2)と同じ場合、大きな問題が発生する可能性があります。

1234567.89は、999999.99に切り捨てられます。 1.2341.23に切り捨てられ、2進数に丸められます。

Lavaralのバグレポートのように聞こえます。 (申し訳ありませんが、私はLavaralを使ったことがないので、詳細を推測しています)はMySQLとIEEE-754を知っています)

関連する問題