6

当我插入 aDOUBLE时,为什么我会看到一个值,就像9.755046187483832e17我选择该值时一样?我怎样才能检索一个数字975504618748383289呢?

4

2 回答 2

7

您可能正在寻找FORMATorROUND功能:

使用FORMAT(),根据您的语言环境和您的特定需求,您可能必须替换千位分隔符

mysql> SELECT FORMAT(9.755046187483832e17,0);
975,504,618,748,383,200

mysql> SELECT REPLACE(FORMAT(9.755046187483832e17,0), ',','');
975504618748383200

另一方面,ROUND()作为一个数字函数,它只输出数字

mysql> SELECT ROUND(9.755046187483832e17,0);
975504618748383200

请参阅http://sqlfiddle.com/#!2/d41d8/17614玩这个。


编辑:正如您所注意到的,最后两位数字四舍五入为00。那是因为DOUBLE精度限制。你必须记住double近似的。如果您需要精确的值和/或比 16 位精度的 double 可用的更多位数,您可能需要将列的类型更改为DECIMAL. 默认情况下DECIMAL具有 10 位精度(10基 10位)。您最多可以明确请求 65 位数字。

例如,如果你需要高达 20 位的精度,你可以这样写:

CREATE TABLE tbl (myValue DECIMAL(20), ...

http://dev.mysql.com/doc/refman/5.6/en/fixed-point-types.html

但请注意,事情并没有那么简单。选择小数列可能会默默地将其转换为double(或bigint?),从而失去额外的精度。您可能必须显式转换为字符串才能保持完整的精度。这意味着您可能必须在应用程序级别处理它。

create table tbl (dblValue DOUBLE, decValue DECIMAL(20,0));
insert into tbl values (975504618748383289, 975504618748383289);

SELECT dblValue, decValue FROM tbl;
--> DBLVALUE            DECVALUE
--> 975504618748383200  975504618748383200

SELECT CAST(dblValue AS CHAR), CAST(decValue AS CHAR) FROM tbl;
--> CAST(DBLVALUE AS CHAR)  CAST(DECVALUE AS CHAR)
--> 9.755046187483832e17    975504618748383289

有关示例,请参见http://sqlfiddle.com/#!2/d5f58/2

于 2013-08-03T18:49:44.713 回答
0

双精度约为 16 位。如果您需要更高的精度,您有两种选择。

如果该值是整数,则bigint最多可以使用大约 19 位的精度。

更好的是decimal最多支持 65 位数字。例如,以下返回错误:

select format(v*v*v*v*v*v*v*v, 0)
from (select 1001 as v) t

因为 的值v被视为bigint

但是,以下工作非常好:

select format(v*v*v*v*v*v*v*v, 0)
from (select cast(1001 as decimal(65, 0)) as v) t

返回1,008,028,056,070,056,028,008,001——这是准确的答案。

如果您需要多达 65 个位置的精度,请使用decimal. 除此之外,您可能必须编写自己的例程。如果您不在该字段上进行算术运算,请考虑将其存储为字符串。

于 2013-08-03T19:45:19.497 回答