让我现在将要在点(76)之后的数字存储到变量中。我应该怎么做?我将在下面给出一个方案。
declare x (3,2);
set x = 323.76;
declare y int;
select cast(substring_index(x, '.', -1) as unsigned) into y;
任何帮助将不胜感激。
作为过程或函数和触发器,您可以使用代码(稍有更改)
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `mantisse`()
BEGIN
declare x DECIMAL(8,2);
declare y int;
set x = 323.76;
select cast(substring_index(x, '.', -1) as unsigned) into y;
INSERT INTO mytable VALUE (y);
END$$
DELIMITER ;
或者,如果您想在查询中使用它,则可以使用用户定义的变量
set @x = 323.96;
select cast(substring_index(@x, '.', -1) as unsigned) into @y;
INSERT INTO mytable VALUE (@y);
您可以使用MOD功能轻松地从数字中获取小数:
SET @num = 323.76;
SET @decimals = MOD(@num, 1) * 100;
SELECT @decimals; -- 76.00
除以1,您可以使用MOD功能获得余数,即0.76
,然后只需将其乘以100。
如果我了解此规范,那似乎很奇怪。我将使用substring_index函数修剪掉点之前(包括点)的所有内容。但是我会做数学运算得出值v
,0 <= v <1
按照问题中给出的MySQL存储程序伪代码,如下所示:
DECLARE x DECIMAL(5,2);
DECLARE y BIGINT;
SET x := 323.76;
SET y := SUBSTRING_INDEX( ABS(x)-FLOOR(ABS(x)) ,'.',-1) + 0;
可能有一种更简单的方法,但这是满足我对规范的理解的一种方法。
作为导出y
值的表达式的说明,请考虑:
SELECT _x
, SUBSTRING_INDEX( ABS(_x)-FLOOR(ABS(_x)) ,'.',-1) + 0 AS _y
FROM ( SELECT 0 AS _x
UNION ALL SELECT 0.1
UNION ALL SELECT 2.0
UNION ALL SELECT 3.3
UNION ALL SELECT -4.00
UNION ALL SELECT -5.55
UNION ALL SELECT 623.76
UNION ALL SELECT -723.76
) t
返回
_x _y
------- -----
0.00 0
0.10 10
2.00 0
3.30 30
-4.00 0
-5.55 55
623.76 76
-723.76 76