2013-10-03 3 views
3

Как это можно считать числом?Как это может быть число?

<cfquery name="test"> 
    SELECT ISNUMERIC("8D4") AS isnum 
</cfquery> 

это возвращает 1.

Существуют ли другие проверки я должен выполнять?

+3

Одно слово: "HexaDecimal". – RBarryYoung

+0

Это может быть слово, но это не имеет никакого отношения к ответу. –

+0

@AdamCameron Да, это архаичный формат научной нотации. – RBarryYoung

ответ

2

D и E считаются особыми случаями для isNumeric(). E легко показать, чтобы отразить научные обозначения:

SELECT ISNUMERIC('8E4'), 8E4 

Результаты в:

1 80000 

случае с D отличается. Многие ресурсы в Интернете описывают его как form of denoting decimal numbers, или just a form of scientific notation.

Складывается странное поведение, если изменение моего SQL выше, чтобы использовать D вместо хотя:

SELECT 8E4, 8D4 

В SQL Studio, это приводит:

(No column Name) D4 
80000    8 

Я не эксперт SQL (любого stripe: я просто разработчик CFML), но это говорит мне, что описание D раньше для десятичных знаков или S/N - это не полная история.

Но что бы ни история, это хорошо документированы, что форма nDn (где n являются цифры) является TRUE к ISNUMERIC().

+0

Вы правы, это не шестнадцатеричный, как я думал. Это архаичная форма научной нотации, о которой я забыл. Это фактически то же самое, что и '8E4'. Нечетное поведение, которое вы видите, связано с ограничением синтаксического анализа (возможно, ошибкой) SQL при попытке отделить числовые литералы от псевдонимов столбцов без пробела, но на самом деле это не имеет никакого отношения к тому, почему '8D4' является число. Чтобы узнать, что это за номер, попробуйте 'SELECT CAST ('8D4' As Float)' вместо этого. – RBarryYoung

+0

Ах! Я попытался использовать 'DECIMAL' и получил ошибку. Хотел бы я сначала попробовать «FLOAT»! –

0

Ваш параметр содержит D, который является шестнадцатеричным. 8D4 (in hex) is 2260 (in decimal)

Таким образом, это действительный номер, поэтому 1 будет возвращен.

+0

Если это так, то '8A4',' 8F4' также будет числовым, да? Но это не так. Вы * проверяли * этот ответ, прежде чем публиковать его? –

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