Mysql Round(x,d)表中的小数

时间:2013-02-21 10:42:05

标签: mysql

对于示例,我有一个下表

 x double
 d tinyint

对于不同的值,我想呈现不同的精度,例如

select round(x,d);

有人有一个很好的解决方案吗?存储过程或使用精度的东西保存在与值相同的表中。


请注意,如果圆形(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 ;

1 个答案:

答案 0 :(得分: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