2016-08-29 2 views
-1

Выполните команду, приведенную ниже в Sql Server 2014.isnumeric с ошибкой?

select ISNUMERIC('1E234') -- return 1 
    select ISNUMERIC('1E2341') -- return 0 

Я ожидаю, что первый запрос возвращает 0

Мое решение:

 -- if return 0 is numeric 
    select PATINDEX('%[^0-9]%','1E234') 
    select PATINDEX('%[^0-9]%','1E2341') 
    select PATINDEX('%[^0-9]%','102341') 

С наилучшими пожеланиями!

+4

В чем вопрос? – jarlh

+3

isnumeric поддерживает 'float' и' real': https://msdn.microsoft.com/en-CA/library/ms173773.aspx +/- 1e308, в основном. 'e2341' выходит за допустимый диапазон. –

+0

Дубликат? http://stackoverflow.com/questions/5988939/isnumeric07213e71-true –

ответ

2

1e234 is Фактически число. Это научная нотация, означающая: 1.00. (Бросить, что в калькуляторе!) Другой пример, чтобы подчеркнуть, будет 3.1e24, которая равна 3,1 .

Вот почему вы получаете этот результат: это правильно (до определенного предела).

3.1E24 => 3,100,000,000,000,000,000,000,904 

1E234 => 1,000,000,000,000,000,256,144, 
      240,016,312,560,912,656,840,512, 
      968,136,864,872,232,424,776,040, 
      744,208,304,800,656,032,440,648, 
      488,920,616,296,544,576,976,448, 
      056,376,040,432,472,424,840,856, 
      440,904,776,056,632,368,528,312, 
      448,144,432,344,224,424,808,952, 
      160,472,416,864,520,520,320,112, 
      296,192,360,016,000,088,968 

1E2341 => too big to calculate!!! 

Проблема с вашим решением, является то, что иногда e используется для числовых обозначений в компьютерной науке тоже, так что е-обозначения должны быть приняты во внимание в качестве рабочего числа.