この記事では、MySQL の ROUND 関数を使用した丸め操作の落とし穴を例を使って説明します。ご参考までに、詳細は以下の通りです。 MySQL では、クエリ結果を丸めるために 問題の説明データテーブルテストがあるとします。テーブル作成ステートメントは次のようになります。 CREATE TABLEテスト( id int(11) NOT NULL AUTO_INCREMENT、 フィールド1 bigint(10) デフォルト NULL, フィールド2 10進数(10,0) デフォルト NULL、 フィールド3 int(10) デフォルト NULL, フィールド4 float(15,4) デフォルト NULL, フィールド5 float(15,4) デフォルト NULL, フィールド6 float(15,4) デフォルト NULL, 主キー (id) )ENGINE=InnoDB デフォルト文字セット=utf8; id フィールドの他に、異なるデータ型の複数のフィールドを含む test という名前のテーブルを作成しました。このテーブルにデータを挿入してみましょう。 INSERT INTO テスト (フィールド1、フィールド2、フィールド3、フィールド4、フィールド5、フィールド6) VALUE (100、100、100、1.005、3.5、2.5); 挿入後、テーブル内のデータは次のようになります mysql> テストから * を選択します。 +----+---------+---------+---------+--------+--------+--------+ | id | フィールド1 | フィールド2 | フィールド3 | フィールド4 | フィールド5 | フィールド6 | +----+---------+---------+---------+--------+--------+--------+ | 1 | 100 | 100 | 100 | 1.0050 | 3.5000 | 2.5000 | +----+---------+---------+---------+--------+--------+--------+ セット内の 1 行 (0.00 秒) 今、次の SQL を実行すると、結果はどうなると思いますか? 選択 round(フィールド1 * フィールド4)、 round(フィールド2 * フィールド4)、 ラウンド(フィールド3 * フィールド4)、 丸め(フィールド1 * 1.005)、 丸め(フィールド2 * 1.005)、 丸め(フィールド3 * 1.005)、 ラウンド(フィールド5)、 ラウンド(フィールド6) テストから; 最初は、上記の 6 つの値はすべて 100 * 1.005 に丸められるため、結果は 101 になり、最後の 2 つは 4 と 3 になるはずだと考えていました。しかし、最終結果は予想とはまったく異なります。 ************************** 1. 行 **************************** 丸め(フィールド1 * フィールド4): 100 丸め(フィールド2 * フィールド4): 100 丸め(フィールド3 * フィールド4): 100 ラウンド(フィールド1 * 1.005): 101 ラウンド(フィールド2 * 1.005): 101 ラウンド(フィールド3 * 1.005): 101 ラウンド(フィールド5): 4 ラウンド(フィールド6): 2 セット内の 1 行 (0.00 秒) なぜこのようなことが起こるのでしょうか?同じ 100*1.005 ですが、データベース内のフィールドを乗算した結果が、フィールドと小数を直接乗算した結果と異なるのはなぜですか? この問題を解決する方法がわかりません。Baidu や Google で検索しましたが、役に立ちませんでした。 。 。自分に頼るしか方法はありません。このとき最も役立つのは、公式 Web サイトのドキュメントです。そこで、ROUND 関数に関する公式 MySQL ドキュメントを検索したところ、次の 2 つのルールが含まれていました。
これら 2 つの規則から、2 つのフィールドを乗算すると、最終結果はfloat型に従って処理され、 float型はコンピューター内の正確な数値ではないため、処理結果は 2 番目の規則に従って処理されることがわかります。直接整数フィールドの結果と 1.005 などの小数演算は、演算に関係する 2 つの値が正確な数値であるため、最初の規則に従って計算されます。 field5 と field6 に対して 要約するこの例から、MySQL で MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL トランザクション操作スキル」、「MySQL ストアド プロシージャ スキル」、「MySQL データベース ロック関連スキルの概要」、および「MySQL 共通関数の概要」 この記事が皆様のMySQLデータベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
序文この記事では主に、MySQL で重複レコードをクエリして削除する方法を紹介します。参考と学習のた...
JavaScript では、要素の removeAttribute() メソッドを使用して、指定され...
問題: vue-cil3 は、`--fix` オプションで修正できる可能性のある警告とともに実行され...
Linux centos7 環境に MySQL をインストールする手順の詳細な紹介MySQLをインス...
序文ヒント: ここで、この記事に記録するおおよその内容を追加できます。例えば、人工知能の継続的な発展...
まず、行の高さが要素の高さと等しい場合にテキストが垂直方向に中央揃えにならない理由を説明します。実際...
目次1. 機能説明2. 親コンポーネント3. サブコンポーネント NextTick.vue 4なぜ未...
多くの人は、Scss を使用する瞬間からコンパイル方法を説明されてきました。したがって、コマンドのコ...
VMware のインストールパッケージのインストールダウンロードアドレス: https://www....
レムの簡単な分析まず、remはCSS単位です。pxの固定ピクセル単位と比較すると、remはより柔軟性...
この記事では主に Vue プロジェクトを紹介します。要素の導入を前提として、コンポーネントを 2 回...
1. コンテナとは、独立して実行されるアプリケーション、またはアプリケーションのグループとその動作環...
目次1. テスト環境1.1 ハードウェアとソフトウェア1.2 テーブル構造2. テストの目的2.1 ...
知らせ! ! ! uid が (a,b,c,null) に含まれないユーザーから * を選択します。...
目次1. ブラウザのローカルストレージ技術1.1、セッションストレージ1.2、ローカルストレージ2....