Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Коллеги, добрый день!

Есть задача получить число с плавающей точкой длиной не 15, а 16 знаков (включая числа после запятой).
15 знаков получаем во float(53), а как получить именно 16 ?

Требуется синхронизировать расчеты, сделанные в FoxPro 2.6, с запросом в T-SQL.
Fox дает 16 действующих знаков, от T-SQL этого добиться не могу. Нужно именно 16 - не больше!

Пример: 11999123456.12334561111 / 3

FoxPro: = 3999707818.707782
T-SQL: = 3999707818.70778

Как можно решить задачу? Нужно, что бы было как в FoxPro.

Спасибо!
23 окт 13, 14:59    [15021063]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
StanislawS,

decimal(38,16)
23 окт 13, 15:10    [15021181]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
В документации четко указано, что 15 знаков - это максимум для флоат.

Сообщение было отредактировано: 23 окт 13, 15:12
23 окт 13, 15:11    [15021191]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Ennor Tiegael,

decimal(38,16) не подходит, вот что он возвращет:

T-SQL = 3999707818.7077818703700000


А надо, именно
3999707818.707782
23 окт 13, 15:17    [15021253]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
StanislawS,

Округлить нельзя?
23 окт 13, 15:18    [15021262]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
pkarklin,

Спасибо, я в курсе. Поэтому и обращаюсь за помощью в поиске альтернативного решения.
23 окт 13, 15:18    [15021269]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Ennor Tiegael,
Можно было бы округлить, но не известно, до какого разряда округлять. Нужно округление именно до 16-го знака в числе, а не после запятой.
23 окт 13, 15:20    [15021279]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Конвертируете в строку, парсите, обрезаете лишнее.

ЗЫ. А лучше ограничиться 15тью.
23 окт 13, 15:29    [15021358]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
pkarklin,
Я уже пробовал :) но опять натыкаю на необходимость округления. Усечение не подходит....
23 окт 13, 15:35    [15021430]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
StanislawS,

Чем вы занимались в школе? Элементарно же:
declare @n decimal(38,16), @x decimal(38,16);

select --@n = rand() * 100000000000 + rand() * 100000,
	@x = rand() * 1000;

set @n = 34756487693986.38756389738768;

select @n, @x, @n / @x, 16 - ceiling(log10(abs(@n / @x))),
	round(@n / @x, 16 - ceiling(log10(abs(@n / @x))));
Корректную обработку ситуации, когда результат деления оказывается между 0 и 1, допишете сами :)
23 окт 13, 15:48    [15021562]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Ennor Tiegael,

Огромное спасибо! Это то, что нужно! Вы великий математик (во всяком случае для меня и моих бывших одноклассников!) )))

Спасибо!
23 окт 13, 16:08    [15021754]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Гость333
Member

Откуда:
Сообщений: 3683
StanislawS,

Вы не очень-то радуйтесь. MSSQL округляет результаты от деления двух decimal(38,16) до шести знаков после запятой:
select decimal_value = cast(1.23456789 as decimal(38,16)) / cast(1.123456789 as decimal(38,16)),
       float_value   = cast(1.23456789 as float)          / cast(1.123456789 as float)

decimal_value                           float_value
--------------------------------------- ----------------------
1.098901                                1,09890109
23 окт 13, 16:18    [15021861]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Гость333,

Кстати, да, тоже обратил внимание, но подумал, что может секрет какой есть.

Не знаю, насколько это подойдет ТС, но изменения типа делителя с decimal(38,16) на bigint, кажется, решает проблему. В крайнем случае money тоже работает, так что если нужна какая-то небольшая дробная часть, то есть способ ее ввести.
23 окт 13, 16:34    [15021978]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Гость333,

Спасибо за уточнение! Буду учитывать.
23 окт 13, 16:40    [15022039]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Ennor Tiegael,

Да, в моём случае похоже подойдет изменение делителя на float
23 окт 13, 16:42    [15022052]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Точность, масштаб и длина
Guest
Ennor Tiegael
Гость333,

Кстати, да, тоже обратил внимание, но подумал, что может секрет какой есть.

есть конечно,

http://msdn.microsoft.com/ru-ru/library/ms190476(v=sql.105).aspx
23 окт 13, 16:43    [15022060]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Гость333
Member

Откуда:
Сообщений: 3683
StanislawS
Ennor Tiegael,

Да, в моём случае похоже подойдет изменение делителя на float

Изменив делитель на float, вы получите результат также типа float. То есть с 15 знаками.
А результат из FoxPro нельзя округлять до 15 знаков?
23 окт 13, 16:47    [15022093]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Мда, если копнуть чуть глубже, то получается еще веселее:
declare @n decimal(38,30), @x bigint;

set @n = 374587.654949758134556;
set @x = 4020919257474127;

select round(@n / @x, 16 - ceiling(log10(abs(@n / @x))));

---------------------------------------
0.0000000000 931 597 057 696 372 90000
Т.е. перед получением результата надо как-то грубо оценивать его порядок, и если он близок к нулю, то изменять тип переменной, расширяя количество знаков после запятой и пересчитывая еще раз.

Ну или нормализацию аргументов делать, откусывая у них 10^x, чтобы результат оказывался в оптимальной зоне.


StanislawS, разделением урановых изотопов вы там занимаетесь, что ли?..
23 окт 13, 17:09    [15022228]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1579
StanislawS
Требуется синхронизировать расчеты, сделанные в FoxPro 2.6, с запросом в T-SQL.
Fox дает 16 действующих знаков, от T-SQL этого добиться не могу. Нужно именно 16 - не больше!
Врёте. Фокс никогда не гарантировал точности более 15 знаков.

Numeric Precision
When storing floating-point numbers in Numeric fields, numeric precision is limited to approximately 15 digits in Visual FoxPro. Therefore, precision more than 15 digits might be lost when converting from decimal to binary numbers, storing numbers with infinitely repeating decimal values in binary, performing multiple repeated operations, and storing numeric values in Character fields and in memory variables in binary format.

This limitation is based on the way Pentium-based processors calculate and store floating-point numbers and follows the Institute of Electrical and Electronics Engineers (IEEE) floating-point specification for manipulating floating-point numbers in binary format. This standard makes it possible for floating-point numbers to be stored in reasonable amount of space and for performing calculations more quickly.

For example, the fraction 1/10 can be represented as a decimal value of 0.1. However, when storing 1/10 in binary, the decimal value is not the same as the fraction. Instead, the fraction is a repeating binary decimal of 0001100110011100110011 and so on. This type of number cannot be represented in memory that is finite or limited; therefore, the decimal value is rounded when stored in binary.

For values requiring higher precision, see Double Field Type.

For more details about floating-point numbers are stored and how Pentium-based processors handle their calculation, see the Microsoft Knowledge Base Article Q78113, "XL: Floating-Point Arithmetic May Give Inaccurate Results" in the MSDN Library at http://msdn.microsoft.com/library/.

The following example illustrates the limit on numeric precision for floating-point numbers for Numeric data types:

x=1234567890.0987654321
? x

The result is 1234567890.0987650000.
23 окт 13, 19:14    [15022822]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Гость333, нет. В FoxPro нельзя ничего менять
24 окт 13, 10:30    [15024463]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Sergey Sizov,
Что значит "врёте"? Во первых, речь о FoxPro 2.6, а Вы, почему то приводите справку по VFP. Вы невнимательны, сударь.
А во вторых, посмотрите вложенный скриншот.

К сообщению приложен файл. Размер - 32Kb
24 окт 13, 10:41    [15024542]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1579
StanislawS
Sergey Sizov,
Что значит "врёте"? Во первых, речь о FoxPro 2.6, а Вы, почему то приводите справку по VFP.
Еще раз - фок НИКОГДА не гарантировал более 15 верных знаков. Во ВСЕХ своих версиях, начиная еще с Foxbase.
Вы невнимательны, сударь.
Кто из нас невнимателен еще большой вопрос.
А во вторых, посмотрите вложенный скриншот.
И что? Где Вы увидели подтверждение верности последних знаков? Да, показываться могут до 20 знаков, но гарантированно верные в них только 15.
Короче, Вы занимаетесь херней сравнивая данные неточных типов на равенство. Округляйте сравниваемые числа до 15 или меньшего числа знаков и только после этого сравнивайте.

Вы еще тут попробуйте рассказать народу про сравнение на равенство двух float/ :) А ведь именно этим и занимаетесь, завуалировав это под сравнение с данными другой системы. Не понимая/не зная, что данные из этой системы есть аналог T-SQL'ного float.
24 окт 13, 12:02    [15025219]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Не понимая/не зная, что данные из этой системы есть аналог T-SQL'ного float.
Более того, оба типа данных (в FoxPro и в T-SQL) — это стандартный double precision floating point (ТС, google it!), который по своей природе не обеспечивает точность 16 в десятичных знаков.
24 окт 13, 12:14    [15025381]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
StanislawS
Member

Откуда: СПб
Сообщений: 16
Sergey Sizov,

автор
Короче, Вы занимаетесь херней сравнивая данные неточных типов на равенство. Округляйте сравниваемые числа до 15 или меньшего числа знаков и только после этого сравнивайте.
Вы еще тут попробуйте рассказать народу про сравнение на равенство двух float/ :) А ведь именно этим и занимаетесь, завуалировав это под сравнение с данными другой системы. Не понимая/не зная, что данные из этой системы есть аналог T-SQL'ного float.


Смени риторику, умник. Не твоего ума дело, для чего мне нужны эти сравнения. Знаток и пониматель, ёпстр.
24 окт 13, 12:46    [15025733]     Ответить | Цитировать Сообщить модератору
 Re: Число с плавающей точкой длиной не 15, а 16 знаков  [new]
Glory
Member

Откуда:
Сообщений: 104751
StanislawS
Смени риторику, умник. Не твоего ума дело, для чего мне нужны эти сравнения. Знаток и пониматель, ёпстр.

Ага. А QA при выполнении
declare @x float
set @x=1
select @x/3

выводит 0.33333333333333331, т.е. вообще 17 знаков после запятой.
Это значит, что на самом деле вам надо ваш FoxPro "подтягивать" что ли ?
24 окт 13, 13:55    [15026366]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить