在MySQL中,将DECIMAL转换为DOUBLE是否可行?

8
我知道所有数字的内在含义,即浮点格式固有的可能舍入问题,但在我的情况下,我想将MySQL中的DECIMAL列直接转换为DOUBLE,而不是在下游进行转换。能否有人帮忙?

1
如文档所指出,CAST无法转换为DOUBLE。在这种情况下,我只使用DECIMAL作为一种有效的中间存储数据的方式。使用查询数据的代码都是以浮点格式表示的。 - c00kiemonster
我不明白你的观点/问题/原因。你的代码使用了浮点数(并非许多编程语言内置的十进制类型),而你的代码显然没有。但是,如果你想在 SQL 中将其作为 double/float 使用和处理,为什么不这样做呢?将其存储为 double,那么你就不需要进行强制转换。(我从来没有想过要检查 CAST 的限制)而且,如果你知道不能将其转换为 DOUBLE,为什么还要问这个问题? - Germann Arlington
1
我很感兴趣知道是否有任何 MySQL 大师知道这是否可能,因此我提出了这个问题。 - c00kiemonster
对我来说仍然毫无意义 - 用double/float计算,然后存储为decimal以节省空间(??? - 现在可不是1980年代),每次获取和存储值时都冒着损失精度的风险。为什么? - Germann Arlington
1
我正在使用SMALLINTMEDIUMINT的组合,根据我想要的小数位进行移位。在我的情况下,我的数字需要比比例更高的精度。通过这种方式,我成功将数据库大小减半(与使用DOUBLE相比)。使用DECIMAL的原因是对INT进行任何非INT操作都会返回DECIMAL - c00kiemonster
显示剩余3条评论
4个回答

13

SELECT my_decimal_field + 0E0 FROM my_table

从MySQL手册中可以看到以下的解释:

9.1.2 数字文字

数字文字包括精确值(整数和DECIMAL)文字和近似值(浮点数)文字。

用幂和指数表示的数字属于近似值数字。

12.22.3 表达式处理

对数字表达式的处理取决于表达式包含的值的类型:

  • 如果有任何近似值,则表达式是近似值且使用浮点算术进行计算。

这是一个老问题,但有人能解释一下为什么这会将十进制转换为双精度吗? - Syco

2
由于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


0

似乎无法将其转换为DOUBLE,这会在进行计算并且例如想要在第三位ROUND()一个DECIMAL 12,2时带来问题。如果您的foobar是DECIMAL 12,2字段,则使用ROUND(foo * bar,2)将忽略附加数字。

话虽如此,您仍然可以像这样做使其正常工作:

ROUND(CAST(foo AS DECIMAL(30,15)*CAST(bar AS DECIMAL(30,15)),2)

-1

使用DECIMAL类型可以节省空间。例如,DECIMAL(4,2)仅占用2个字节。而FLOAT需要4个字节,DOUBLE需要8个字节。

至于原问题,只需执行以下操作:

ALTER TABLE t MODIFY COLUMN c DOUBLE ...;

(“...”应包括您已经拥有的其他内容,例如NOT NULL。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接