我知道所有的数字含义,即浮点格式固有的可能的舍入问题,但在我的情况下,我有一些DECIMAL
列MySQL
,我想DOUBLE
在查询中直接转换为直接MySQL
而不是下游。
有人可以帮忙吗?
SELECT my_decimal_field + 0E0 FROM my_table
MySQL手册中的以下引用解释了它是如何工作的:
数字文字包括精确值(整数和十进制)文字和近似值(浮点)文字。
以科学记数法表示的带有尾数和指数的数字是近似值数字。
数值表达式的处理取决于表达式包含的值类型:
- 如果存在任何近似值,则表达式是近似的,并使用浮点算术进行评估。
由于 MySQL 内置CAST
函数的限制,只能使用您自己的用户定义的强制转换函数转换DECIMAL
为。DOUBLE
示例用例:
SELECT castDecimalAsDouble(0.000000000000000000100000000000);
结果:1e-23
CREATE DEFINER=`root`@`localhost` FUNCTION `castDecimalAsDouble`(
decimalInput DECIMAL(65,30) ) RETURNS double
DETERMINISTIC
BEGIN
DECLARE doubleOutput DOUBLE;
SET doubleOutput = decimalInput;
RETURN doubleOutput;
END
DOUBLE
如果您进行计算并且例如想要在第三位数字中,似乎不可能将其转换为会ROUND()
带来DECIMAL 12,2
问题。如果您的和是 DECIMAL 12,2 字段,使用ROUND(foo * bar,2)
将忽略额外的数字。foo
bar
也就是说,你可以做这样的事情来让它工作:
ROUND(CAST(foo AS DECIMAL(30,15)*CAST(bar AS DECIMAL(30,15)),2)
DECIMAL可以节省空间。例如,DECIMAL(4,2)
只占用 2 个字节。 FLOAT
需要4个;DOUBLE
需要 8 个。
至于原始问题,只需执行以下操作:
ALTER TABLE t MODIFY COLUMN c DOUBLE ...;
(“...”应该包括您已经拥有的其他内容,例如NOT NULL
。)