2013-08-03 2 views
2

Когда я вставляю DOUBLE, почему я вижу значение, подобное 9.755046187483832e17, когда я выбираю это значение? Как я могу получить номер, например 975504618748383289?Отключить научную нотацию MySQL

+0

Одним большим преимуществом научной нотации является то, что она справедливо представляет точность, доступную в значении. Если показатель экспоненты был '30' (' 1.23e30'), то обозначение с фиксированной точкой генерирует приблизительно 14 случайных цифр. – wallyk

ответ

5

Вы, вероятно, ищете FORMAT или ROUND функции:

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 для игры с этим.


EDIT: Как вы заметили, последние две цифры округлены до . Это из-за пределов точности DOUBLE. Вы должны помнить, что double являются приблизительно. Если вам нужны точные значения и/или больше цифр, чем доступно с 16-битной точностью двойного действия, вам, вероятно, необходимо изменить тип столбца на DECIMAL. По умолчанию DECIMAL имеет 10 цифр точности (10 base 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.

+0

Спасибо, но это устанавливает последние две цифры в 0. Мне нужны значения десятков и единиц. –

+1

@RosePerrone Там _is_ нет значения для десятков и единиц. По крайней мере, в примере Сильвена. Вы можете получить некоторые другие результаты, но имейте в виду, что [double имеет только около 16 десятичных цифр точности] (http://en.wikipedia.org/wiki/Double-precision_floating-point_format). – Carsten

+0

@RosePerrone Я в значительной степени отредактировал свой ответ в отношении потери точности. –

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. Кроме того, вам, возможно, придется писать свои собственные подпрограммы. Если вы не выполняете арифметику в поле, тогда подумайте о ее сохранении в виде строки.

Смежные вопросы