2015-05-09 2 views
3

Я искал google и этот stackoverflow, прежде чем задавать этот вопрос, и я не нашел результата, который мог бы решить мою проблему. Теперь у меня заканчиваются ключевые слова, чтобы искать больше. Мне хотелось бы, чтобы кто-то здесь мог мне помочь.Как получить точный результат (не округленный результат) в SQL Server 2008 R2?

Вот моя проблема: Я имею дело с большим количеством данных и использованием SQL Server 2008 R2 в качестве базы данных. Я получил некоторые ошибки в значениях данных и причина этого аналогичный запрос:

SELECT (SELECT 93834718293817283242347.982763509735278) * (SELECT 100/100) 

В результате 93834718293817283242347.982764 и вызывает некоторое неправильное значение для моего расчета. Я хочу, чтобы результат был 93834718293817283242347.982763509735278 Как мне это сделать?

Я попробовал еще один способ, как это и до сих пор не отвечает мои ожидания

SELECT CONVERT(DECIMAL(38,15), 93834718293817283242347.982763509735278) * CONVERT(DECIMAL(38,15), (100/100)) 

Выход 93834718293817283242347.982764, но я хочу 93834718293817283242347.982763509735278

И если вы не возражаете, мне нужно какое-то объяснение это. Спасибо

+0

почему нельзя использовать подстроку и CHARINDEX выбрать значения и сцепить @Burhan Mubarok – mohan111

+0

дело не можешь использовать этот трюк, я использовал некоторые вычисления и умножение. –

+0

сейчас почти 10 месяцев вы реагируете ... awestruck – mohan111

ответ

2

На самом деле я не знаю, как решить эту проблему, но я даю вам некоторое объяснение того, что происходит. Ну, давайте посмотрим на свойства значений:

DECLARE @number SQL_VARIANT 
SELECT @number =93834718293817283242347.982763509735278 
SELECT @number 
SELECT 
    SQL_VARIANT_PROPERTY(@number, 'BaseType') BaseType, 
    SQL_VARIANT_PROPERTY(@number, 'MaxLength') MaxLength, 
    SQL_VARIANT_PROPERTY(@number, 'Scale') Scale, 
    SQL_VARIANT_PROPERTY(@number, 'Precision') Precision 

Вторая:

DECLARE @number SQL_VARIANT 
SELECT @number =100.0/100.0 
SELECT @number 
SELECT 
    SQL_VARIANT_PROPERTY(@number, 'BaseType') BaseType, 
    SQL_VARIANT_PROPERTY(@number, 'MaxLength') MaxLength, 
    SQL_VARIANT_PROPERTY(@number, 'Scale') Scale, 
    SQL_VARIANT_PROPERTY(@number, 'Precision') Precision 

и умножение

DECLARE @number SQL_VARIANT 
SELECT @number =CONVERT(DECIMAL(38,15), 93834718293817283242347.982763509735278) * (100/100) 
SELECT @number 
SELECT 
    SQL_VARIANT_PROPERTY(@number, 'BaseType') BaseType, 
    SQL_VARIANT_PROPERTY(@number, 'MaxLength') MaxLength, 
    SQL_VARIANT_PROPERTY(@number, 'Scale') Scale, 
    SQL_VARIANT_PROPERTY(@number, 'Precision') Precision 

Посмотрите на результат тщательно:

BaseType    MaxLength   Scale    Precision 
-------------------- -------------------- -------------------- ------------- 
decimal    17     6     38 

As вы знаете, вы не можете объявить в масштабе CONVERT(DECIMAL(38,15), 93834718293817283242347.982763509735278), иначе вы получите Arithmetic overflow error converting numeric to data type numeric..
Итак, в связи с folmulas here SQL Server не может добавить два значения масштаба и beacause того, что он использует шкалу по умолчанию . Посмотрите на следующем пример, он дает масштаб :

SELECT CONVERT(DECIMAL(38,4), 93834718293817283242347.982763509735278) * CONVERT(DECIMAL(38,1), (100/100)) 
+0

Спасибо за ответ, но я не нашел solutin, –

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