0

例として、次の表があります

 x double
 d tinyint

さまざまな値に対して、たとえば、さまざまな精度を提示したい

select round(x,d);

誰かがこれに対する良い解決策を持っていますか? ストアド プロシージャまたは精度で動作するものは、値と同じテーブルに保存されます。


round(X, D) の D が列の場合、期待した結果が得られないことに注意してください。

次のことを試してみると:

USE test;
DROP TABLE IF EXISTS test_tbl;
CREATE TABLE test_tbl (x double, d tinyint) ENGINE MyISAM;
INSERT IGNORE INTO test_tbl (x,d) VALUES (1.12,3),(1.1234,3);
SELECT x,d,round(x,3),round(x,d) FROM test_tbl;

結果は次のようになります。

x      d  round(x,3)  round(x,d)
1.12   3  1.120       1.12
1.1234 3  1.123       1.123

最初のラウンド (x,d) は 1.120 ではなく、1.12 と表示されることに注意してください。


更新された回避策

以下に示すように関数を定義すると、期待される結果が得られます。

DELIMITER $$
DROP FUNCTION IF EXISTS StrRound;
CREATE FUNCTION StrRound(x double, d tinyint) RETURNS varchar(16) DETERMINISTIC COMMENT 'Returns string where x is rounded to d decimals (d from -6 to 6)'
BEGIN
  DECLARE s varchar(16);
  IF d=0 THEN SET s=cast(round(x, 0) as char);
  ELSEIF d=1 THEN SET s=cast(round(x, 1) as char);
  ELSEIF d=2 THEN SET s=cast(round(x, 2) as char);
  ELSEIF d=3 THEN SET s=cast(round(x, 3) as char);
  ELSEIF d=4 THEN SET s=cast(round(x, 4) as char);
  ELSEIF d=5 THEN SET s=cast(round(x, 5) as char);
  ELSEIF d=6 THEN SET s=cast(round(x, 6) as char);
  ELSEIF d=-1 THEN SET s=cast(round(x, -1) as char);
  ELSEIF d=-2 THEN SET s=cast(round(x, -2) as char);
  ELSEIF d=-3 THEN SET s=cast(round(x, -3) as char);
  ELSEIF d=-4 THEN SET s=cast(round(x, -4) as char);
  ELSEIF d=-5 THEN SET s=cast(round(x, -5) as char);
  ELSEIF d=-6 THEN SET s=cast(round(x, -6) as char);
  ELSE SET s=cast(x as char);
  END IF;
  RETURN s;  
END;$$
DELIMITER ;
4

1 に答える 1

0

MySQLのマニュアルによると「戻り値の型は第一引数の型と同じ」 また、ROUNDの動作はMySQLのバージョンに依存する

MySQL 5.5.30 でサンプルを実行すると、末尾のゼロがすべて削除されました。

x      d  round(x,3)  round(x,d)
1.12   3  1.12        1.12
1.1234 3  1.123       1.123

あなたがそこに得たものは、結果のレンダリングの問題かもしれません。両方のタイプが float (round(x,3) と round(x,d)) である必要があるため、動作が異なる理由は不明です。

とにかく、FORMAT関数を使用して末尾のゼロの数を強制することができます:

SELECT x,d,FORMAT(round(x,3),3),FORMAT(round(x,d),d) FROM test_tbl;

http://sqlfiddle.com/#!2/5b125/3

于 2013-04-17T17:52:02.573 に答える