当我插入DOUBLE
时,为什么在选择该值时会看到9.755046187483832e17
之类的值?如何检索975504618748383289
之类的数字?
答案 0 :(得分:5)
使用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。
答案 1 :(得分: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
。除此之外,您可能必须编写自己的例程。如果您没有对该字段进行算术运算,请考虑将其存储为字符串。