8

我知道所有的数字含义,即浮点格式固有的可能的舍入问题,但在我的情况下,我有一些DECIMALMySQL,我想DOUBLE在查询中直接转换为直接MySQL而不是下游。

有人可以帮忙吗?

4

4 回答 4

11

SELECT my_decimal_field + 0E0 FROM my_table

MySQL手册中的以下引用解释了它是如何工作的:

9.1.2 数字文字

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

以科学记数法表示的带有尾数和指数的数字是近似值数字。

12.22.3 表达式处理

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

  • 如果存在任何近似值,则表达式是近似的,并使用浮点算术进行评估。
于 2015-10-07T11:31:47.960 回答
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

于 2018-09-22T11:47:13.423 回答
0

DOUBLE如果您进行计算并且例如想要在第三位数字中,似乎不可能将其转换为会ROUND()带来DECIMAL 12,2问题。如果您的和是 DECIMAL 12,2 字段,使用ROUND(foo * bar,2)将忽略额外的数字。foobar

也就是说,你可以做这样的事情来让它工作:

ROUND(CAST(foo AS DECIMAL(30,15)*CAST(bar AS DECIMAL(30,15)),2)
于 2015-09-06T16:46:12.783 回答
-1

DECIMAL可以节省空间。例如,DECIMAL(4,2)只占用 2 个字节。 FLOAT需要4个;DOUBLE需要 8 个。

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

ALTER TABLE t MODIFY COLUMN c DOUBLE ...;

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

于 2015-04-18T18:33:09.307 回答