Mysql四舍五入(x,d),表中的小数

Mysql四舍五入(x,d),表中的小数,mysql,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

对于这个例子,我在下表中有一个例子

 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 ;
根据MySQL手册: “返回类型与第一个参数的类型相同” 轮的行为也取决于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
所以你们得到的可能是结果呈现问题。不确定行为为何不同,因为这两种类型都应该是浮动(圆形(x,3)和圆形(x,d))

无论如何,您可以使用FORMAT函数强制设置尾随零的数量:

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

使用十进制而不是双精度怎么样?使用十进制不会影响舍入函数的结果?您提到过“精度可以工作”-在我看来,现在使用精度就是使用小数。有很多变量您没有提到-谁将使用这个表?、逻辑和公式-mysql中的句柄?只是一个显示问题?等。参考mysql双精度与十进制和。希望这有助于充分考虑我使用的是精度,而不是更切题的小数。问题是“每行”在mysql中保存小数的数量(与值本身相同)。所有正常的解决方案都需要每列预定义的小数数,这是十进制列类型的情况,或者当您使用“round(column,3)”对字段进行四舍五入时,这里的问题是是否有人有一个针对每行小数的变通解决方案。