|   |   | 
| 
 | Округление поля в результате запроса | ☑ | ||
|---|---|---|---|---|
| 0
    
        sqr4 23.10.19✎ 15:47 | 
        Сам запрос 
 
Поле 1 = 240,280949 Поле 2 = 240,2809495412844036697247 Не могу понять почему такая разница в округлении, прошу помощи. | |||
| 1
    
        sqr4 23.10.19✎ 15:48 | 
        Конфа КА 1 последняя     | |||
| 2
    
        ДенисЧ 23.10.19✎ 15:54 | 
        А зачем ты это в запросе делаешь?     | |||
| 3
    
        mc lammer 23.10.19✎ 15:55 | 
        быть может в СУБД типы данных  СтоимостьОстаток  и КоличествоОстаток  не соответствуют Число(15,2) и Число(15,3),  и результат вычисления поэтому различается.  надо смотреть трассировку запроса.     | |||
| 4
    
        sqr4 23.10.19✎ 16:04 | 
        (2) это не я делаю, я упростил запрос, это разработчики КА1     | |||
| 5
    
        hhhh 23.10.19✎ 16:09 | 
        (4) Надо Выразить на всё выражение. А то как у вас Выразить / Выразить - это получается без округления.     | |||
| 6
    
        sqr4 23.10.19✎ 16:12 | 
        (5) А вторая строка с округлением?     | |||
| 7
    
        sqr4 23.10.19✎ 16:14 | 
        Тут тоже УчетЗатратОстатки.СтоимостьОстаток / УчетЗатратОстатки.КоличествоОстаток КАК Поле1 нет округления, но результат выводит только три цифры, уменьшая разрядность чисел до таких
 Выразить(11000061.87 Как Число(8,0))/Выразить(45780.000 Как Число(8,0)) Как поле2, ПОлучил в поле 2 такой результат 240,28095238095238095 опять же неокругленный. | |||
| 8
    
        sqr4 23.10.19✎ 16:25 | 
        А вот такое
 Выразить(11000061.87 Как Число(38,10))/Выразить(45780.000 Как Число(38,10)) Как поле2, Поле2 = 240,280949 | |||
| 9
    
        sqr4 23.10.19✎ 16:27 | 
        Подсказку взял отсюда
 https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-ver15 При выполнении операций умножения и деления требуется precision - scale разрядов для хранения целой части результата. Масштаб может уменьшаться согласно приведенным ниже правилам. Итоговый масштаб уменьшается до min(scale, 38 - (precision-scale)), если целая часть короче 32 разрядов, так как он не может быть больше 38 - (precision-scale). В этом случае результат может округляться. Масштаб не изменяется, если он меньше 6 и если целая часть длиннее 32 разрядов. В этом случае может возникнуть ошибка переполнения, если число не помещается в decimal(38, scale). Масштаб будет задан равным 6, если он больше 6 и если целая часть длиннее 32 разрядов. В этом случае уменьшаются как целая часть, так и масштаб, и итоговым типом будет decimal(38,6). Результат может округляться до 6 десятичных знаков, либо может возникнуть ошибка переполнения, когда целая часть не помещается в 32 разряда. | |||
| 10
    
        sqr4 23.10.19✎ 16:31 | 
        Где на ИТС об этом почитать?     | |||
| 11
    
        Chameleon1980 23.10.19✎ 16:34 | 
        Ты делишь округленное на округленное, но результат не окркгляешь.     | |||
| 12
    
        sqr4 23.10.19✎ 16:40 | 
        (11) в первом случае тоже, но результат разный поэтому и задал вопрос. В ходе параллельного гуглежа нащупал в чем дело. Теперь бы хотелось документированное описание почитать, пока не нашел     | |||
| 13
    
        Chameleon1980 23.10.19✎ 16:49 | 
        Что ожидал в (8)?
 Оберни все выражение в выразить какое нужно ещё раз | |||
| 14
    
        Chameleon1980 23.10.19✎ 16:51 | 
        240,28094954128
 ? | |||
| 15
    
        sqr4 23.10.19✎ 16:53 | 
        (14) мне нужно первое, которое округленное     | |||
| 16
    
        sqr4 23.10.19✎ 16:54 | 
        (13) У меня цель разобраться в том почему так получается     | |||
| 17
    
        Chameleon1980 23.10.19✎ 17:14 | 
        (16) бля. получается так, а ожидал что?     | |||
| 18
    
        Chameleon1980 23.10.19✎ 17:16 | 
        (15) еще раз блин.
 Все округли теперь Выразить(11000061.87 /45780.000 Как Число(8,0)) Как поле2 | |||
| 19
    
        Chameleon1980 23.10.19✎ 17:17 | 
        или
 если ты хочешь сначала округлить операнды: Выразить(Выразить(11000061.87 Как Число(8,0))/Выразить(45780.000 Как Число(8,0) как ЧИсло(15,0)) Как поле2 | |||
| 20
    
        novichok79 23.10.19✎ 17:19 | 
        какая СУБД?     | |||
| 21
    
        sqr4 23.10.19✎ 17:19 | 
        (18) да нахера мне округлять, у меня бл.ть два однотипных выражения
 УчетЗатратОстатки.СтоимостьОстаток / УчетЗатратОстатки.КоличествоОстаток КАК Поле1, (тут Стоимость остаток = 11000061.87 и количество остаток = 45780.000) 11000061.87 /45780.000 Как поле2, В итоге Поле 1 = 240,280949 Поле 2 = 240,2809495412844036697247 Вопрос почему, вопрос почемуууууу. Мне не надо приводить к общему целому через выразить. Мне надо понять как это работает в общем случае. | |||
| 22
    
        novichok79 23.10.19✎ 17:20 | 
        если MS SQL, то если у тебя используется в делении выразить, то надо выражать и результат тоже.
 году в 2011-м сталкивался с этим. возможно в 1С пофиксили уже. | |||
| 23
    
        novichok79 23.10.19✎ 17:24 | 
        это глюк, если что.     | |||
| 24
    
        sqr4 23.10.19✎ 17:27 | 
        (20) MS SQL тут понятно что разрядность этих полей превышает вот это
 Масштаб будет задан равным 6, если он больше 6 и если целая часть длиннее 32 разрядов. В этом случае уменьшаются как целая часть, так и масштаб, и итоговым типом будет decimal(38,6). Результат может округляться до 6 десятичных знаков, либо может возникнуть ошибка переполнения, когда целая часть не помещается в 32 разряда. Наверно имеет смысл посмотреть, каким образом строится выборка из виртуальной таблицы остатков в плане разрядности полей. | |||
| 25
    
        sqr4 23.10.19✎ 17:28 | 
        Но где найти инфу про это и есть ли она. Как по мне не похоже на глюк в моем случае. 
 причем если я использую виртуальную таблицу остатков и оборотов, то результат другой поле 1 = 240,2809495412844036697247 | |||
| 26
    
        Chameleon1980 23.10.19✎ 17:30 | 
        (21) Ну пардон. я чет думал ты думаешь почему не округляет.
 вижу теперь интересно | |||
| 27
    
        sqr4 23.10.19✎ 17:32 | 
        Ну наверно на самом деле ответ в (3)     | |||
| 28
    
        kabanoff 23.10.19✎ 17:56 | 
        (0) Потому что на скуле это выглядит вот так:
 
Исходный запрос: 
 | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |