Это происходит потому, что функция length()
принимает в качестве входных данных строку, а не число, поэтому значение неявно преобразуется в строку с использованием некоторого формата по умолчанию, прежде чем функция когда-либо увидит его.
Может быть более элегантное математическое решение, но одним из подходов было бы использование «текстового минимума» числовой формат , length(to_char(num,'TM'))
:
with demo(num) as (select 10.00000000000000000000000000000000000004 from dual)
select to_char(num)
, to_char(num,'TM')
, length(to_char(num,'TM'))
from demo;
TO_CHAR(NUM) TO_CHAR(NUM,'TM') LENGTH(TO_CHAR(NUM,'TM'))
------------- ----------------------------------------- -------------------------
10 10.00000000000000000000000000000000000004 41