У меня есть столбец с чрезвычайно большим набором значений (> 21k) с неопределенным количеством десятичных знаков, некоторые существующие данные образца (FLOAT):
6.46
0.784
8.05
86.4
2.64
0
2.14
1E-06
14.81
3.45
0.87243
0
1.12279
0
21.41
0.6243
Я хотел бы вернуть все значения, как показано, ЗА ИСКЛЮЧЕНИЕМ «1E-06» должно быть .000001; кроме того, любая научная запись должна быть в чисто десятичном формате.
Я попытался написать какой-то оператор CASE, где за «THEN» следует «CONVERT (varchar (100), CAST (@ testFloat AS decimal (38, x em>)))», где x — это количество sig figs, но мне не удалось получить правильное условие для оператора WHEN, вот моя лучшая попытка:
CASE
WHEN @testFloat = 0 THEN @testFloat
WHEN FLOOR(@testFloat*10) != @testFloat*10 THEN CONVERT(varchar(100), CAST(@testFloat AS decimal(38,2)))
WHEN FLOOR(@testFloat*100) != @testFloat*100 THEN CONVERT(varchar(100), CAST(@testFloat AS decimal(38,3)))
*etc*
END
Почти уверен, что я даже не был на правильном пути....
FLOAT
не имеет реального представления о значащих цифрах в десятичной системе (в любом случае это округленные двоичные цифры), но в первом приближенииselect FORMAT(1e-6, '0.' + REPLICATE('#', 308))
может подойти. Это позволит полностью избежать нотацииE
за счет создания действительно громоздкой нотации для очень больших/маленьких чисел. (На практике308
можно уменьшить, если ваши числа никогда не будут такими экстремальными, что, возможно, ускорит форматирование.) - person Jeroen Mostert   schedule 15.02.2019#
даже самые маленькие (или самые большие) значения не будут использовать экспоненциальное представление, поскольку оно охватывает весь диапазонFLOAT
. (Хотя, если подумать, это просто крайние показатели степени - вам нужно больше значений для мантиссы в крайнем конце. Сделайте его 400, чтобы быть уверенным, почему бы и нет...) Я не знаю более короткого выражения что позволит добиться того же эффекта.FORMAT
использует строки формата .NET, задокументированные здесь, если вы хотите попробовать сами. - person Jeroen Mostert   schedule 15.02.20190
или#
позаботится о части до десятичной точки, независимо от того, насколько она велика. После периода это другая игра. - person Jeroen Mostert   schedule 15.02.20191e-6
в своем фрагменте кода, я бы просто вставил нужное поле, верно? После выходных попробую ваше решение. Если вы уверены в своем решении, я бы написал его как ответ, в любом случае это скоро будет помечено как «разговор». - person Paniom   schedule 16.02.2019