Вычисление типа данных SQL Server Float по сравнению с десятичным - PullRequest
2 голосов
/ 07 декабря 2011

В следующем запросе

declare @a float(23)
declare @b float(23)
declare @c float(53)
set @a = 123456789012.1234
set @b = 1234567.12345678
set @c = @a * @b
select @c

select LTRIM(STR((@c),32,12))

declare @x  decimal(16,4)
declare @y decimal(16,8)
declare @z decimal (32,12)

set @x = 123456789012.1234
set @y = 1234567.12345678
set @z = @x * @y
select @z

Я получаю ответы как

1.52415693411713E+17
152415693411713020.000000000000
152415692881907790.143935926652

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

Или я делаю что-то в корне неправильно.

Кстати, это связано с проблемой, возникшей у меня с устаревшей системой, в которой я должен использовать float в качестве типа данных для хранения, в то же время при вычислении не должно быть потери точности.

Пожалуйста, предложите альтернативы или объяснение.

Ответы [ 2 ]

6 голосов
/ 07 декабря 2011

Число с плавающей запятой с точностью до 15 значащих цифр * только 1002 * (в SQL Server).

Это демонстрируется 1.52415693411713 E+17, где 1.52415693411713 (15 цифр) является настолько точным, насколько вы получите.Окончательное значение 020... после 152415693411713 с STR составляет , составленное , является разрешением с плавающей запятой

Чтобы сохранить точность,не используйте поплавок.Это так просто.CAST к десятичному числу, если вы хотите рассчитать, но если вы CAST вернетесь к плавающему значению, вы ограничены 15 цифрами

См. "Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой«

0 голосов
/ 07 декабря 2011

Последний ответ

152415692881907790.143935926652

обеспечивает масштабирование до 12 десятичных знаков, потому что вы соответственно объявили @z.

declare @z decimal (32,12)

Второй параметр в этом объявлении - это масштаб, которыйустановить на 12.

Подробнее об этом можно узнать на http://msdn.microsoft.com/en-us/library/ms187746.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...