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

Откуда: Ростов н/Д
Сообщений: 137
select round(1.23446, 3) возвращает 1.23400
Но ведь это не правильно! Еще в школе (кажется, в 5 классе) учат, что округление всегда начинается с последнего знака. Т.е., 1.23446 округляется до 1.2345 и только потом - 1.235.
Как бы все-таки получить правильный результат?
17 мар 05, 14:10    [1394510]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
хорошая у вас школа была
17 мар 05, 14:16    [1394536]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
ИМХО
round(1.23446, 3) и должен быть равен 1.234
не помню, чтоб этому учили
при округлени с последнего знака(а не совместно мы теряем точность на каждом шаге)
для наглядности
1.23446*1000 = 1234.46 теперь если это к целому привести, то получим 1234, а не 1235(тк 0.46<0.54)
так что всё верно
17 мар 05, 14:16    [1394537]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Glory
Member

Откуда:
Сообщений: 104760
Еще в школе (кажется, в 5 классе) учат, что округление всегда начинается с последнего знака
По-моему в школе учат, что при округлении роассматривабтся не все цифры после заданной в только одна - 1.234_4_6 = 1.2340
17 мар 05, 14:17    [1394541]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
MCMXCVIII
Member

Откуда:
Сообщений: 130
Утюг
select round(1.23446, 3) возвращает 1.23400
Но ведь это не правильно! Еще в школе (кажется, в 5 классе) учат, что округление всегда начинается с последнего знака. Т.е., 1.23446 округляется до 1.2345 и только потом - 1.235.
Как бы все-таки получить правильный результат?


Округляться должно в ближнюю сторону !
if abs(1.23446 - 1.23500) > abs(1.23446 - 1.23400) 
  select 1.23400
else select 1.23500
--------------------
1.23400

Все верно !
17 мар 05, 14:17    [1394545]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
MCMXCVIII
Member

Откуда:
Сообщений: 130
А меня в школе учили, что если A+B=A, то значит B=0 !
declare @a float,
        @b float

select @a = power(10.0, 9), @b = 1.0 / power(10.0, 9)

if @a + @b = @a select 'B = 0'
if @b <> 0 select 'B <> 0'
-----------------
'B = 0'
'B <> 0'
17 мар 05, 14:27    [1394594]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Утюг
Member

Откуда: Ростов н/Д
Сообщений: 137
iSestrin
хорошая у вас школа была

Да неплохая, между прочим.
Значит, round(0.45,0) = 0 - это правильно? А если вам так зарплату будут округлять?
17 мар 05, 14:31    [1394610]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
а вы всю свою жизнь так считали
round(0.45,0) = 0
17 мар 05, 14:35    [1394645]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
в смысле так round(0.45,0) = 1
17 мар 05, 14:35    [1394647]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
MCMXCVIII
Member

Откуда:
Сообщений: 130
Утюг
iSestrin
хорошая у вас школа была

Да неплохая, между прочим.
Значит, round(0.45,0) = 0 - это правильно? А если вам так зарплату будут округлять?


Правильно ! Так им. В ноль не округляем, а все дружно округляем вверх. И бежим менять одну копейку на баксы. Пускай там тоже в ноль не округляют после того как ее на курс ЦБ РФ разделят.
17 мар 05, 14:37    [1394659]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Taffy
Member

Откуда:
Сообщений: 20501
Утюг
iSestrin
хорошая у вас школа была

Да неплохая, между прочим.
Значит, round(0.45,0) = 0 - это правильно? А если вам так зарплату будут округлять?

Правильно.
Все доказательства уже приведены. Откройте учебник математики.
0.45 < 0.5 значит при окуглении до целого будет 0
17 мар 05, 14:39    [1394675]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34263
Блог
Это наверняка шутка)
17 мар 05, 16:03    [1395042]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Утюг
Member

Откуда: Ростов н/Д
Сообщений: 137
Критик
Это наверняка шутка)

Наконец то :)
Хотя и не совсем. Просто меня уже достали в конторе этим вопросом, часть их аргументов я вам привел, мои контры они не слушают, говорят, выдумываю, теперь покажу им эту ветку, пусть читают.
Всем спасибо, извините, если что не так.
17 мар 05, 16:40    [1395224]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
и что вам в конторе говорят? что 0.45 = 1 и вы их опровергаете? или наоборот?

для спящего время бодрствования равносильно сну
17 мар 05, 17:06    [1395343]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Утюг
Member

Откуда: Ростов н/Д
Сообщений: 137
Алексей2003
и что вам в конторе говорят? что 0.45 = 1 и вы их опровергаете? или наоборот?

для спящего время бодрствования равносильно сну


Люди хотят получить 0.45 = 1, ну и ладно бы, просто хотели, но с пеной у рта (намного круче, чем я здесь) упирают на то, что правильно так, и никак иначе.
У меня, к сожалению, нет учебника за пятый класс, на который были ссылки, и я не могу их попросить показать, где это написано. Хотя, в целом, ход их мыслей понятен, последовательное округление даст единицу (как изложено в первом топике). Но, насколько мне известно, ни один язык программирования, поддерживающий эту функцию, не даст round(0.45,0)=1 (хотя VB и VBA, например при round(0.5, 0) дают 0, но это к слову), и я как-то больше склонен доверять людям, которые эти языки создавали, нежели конторскому люду (даже не учитывая собственной уверенности и всего вышесказанного всеми вами).
17 мар 05, 19:30    [1395825]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
эт всё для бухучёта?
если "да", то абсолютли пофиг, что кто думает и кого чему учили.
бухучёт вообще не имеет ничего общего ни со здравым смыслом ни с наукой.
налоговая - вот кто должен отвечать на эти вопросы.
если "нет", то надо таки пойти и купить учебник. платит кто неправ ;)
17 мар 05, 19:49    [1395877]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
MCMXCVIII
Member

Откуда:
Сообщений: 130
Утюг

Но, насколько мне известно, ни один язык программирования, поддерживающий эту функцию, не даст round(0.45,0)=1 ...

Можно написать такую функцию самому.
Утюг

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

Доверять надо только здравому смыслу, по которому :
1) round(0.45,0) = 0, это - факт.
2) программа при округлении 0.45 должна выдавать столько, сколько хочет заказчик.
17 мар 05, 19:51    [1395880]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Утюг
Member

Откуда: Ростов н/Д
Сообщений: 137
[/quot]
2) программа при округлении 0.45 должна выдавать столько, сколько хочет заказчик.[/quot]

Это так, но при условии, что, когда через полгода выяснится их неправота, крайним не окажусь я (как уже однажды было по другому поводу - оказалось, я плохо отстаивал свое мнение). Сейчас я поднял всю эту волну для того, чтобы, при наступлении такого момента, сунуть под нос распечатку этой ветки. О! И заставлю их под ней расписаться, типа видели, в курсе.
А функцию я им напишу, пусть хоть 0.45 до 100 округляют.
Я думаю, тему можно закрыть, если никто не против.
18 мар 05, 06:43    [1396241]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
ну и напишите свою функцию округления, округляйте только с её помощью.
Если что изменится - измените функцию и всего то
18 мар 05, 09:10    [1396403]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Smirnov Anton
ну и напишите свою функцию округления, округляйте только с её помощью.
Если что изменится - измените функцию и всего то
Большинсто программ по бухучёту так и делают.

Off: Чисто для справки. Microsoft в разных своих продуктах использует разные методы округления.
В SQL Serverе - round to larger а в VBScript - round to even
exec xp_cmdshell 'echo WScript.Echo round(0.45, 1) > c:\temp\test_round.vbs & echo WScript.Echo round(0.55, 1) >> c:\temp\test_round.vbs & cscript //nologo c:\temp\test_round.vbs && del c:\temp\test_round.vbs /Q'
/*
0.4 -- round(0.45, 1)
0.6 -- round(0.55, 1)
*/
18 мар 05, 09:43    [1396501]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Утюг
Еще в школе (кажется, в 5 классе) учат, что округление всегда начинается с последнего знака.

Позавчера объяснял ребенку округление. У них в учебнике определение типа:
Число можно округлять до едениц, десятков, сотен, десятых долей, сотых долей и т.д. Если округляемые цифры находятся справа от запятой, то они отбрасываются, если слева, то заменяются нулями. Если первая цифра из округляемых разрядов равна 5,6,7,8,9, то цифра перед ней увеличивается на 1, если первая цифра из округляемых разрядов равна 0,1,2,3,4, то цифра перед ней остается неизменной.
Пока заставил выучить, сам выучил.
18 мар 05, 10:09    [1396608]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Мне кажется, что здесь проблемма лежит в другой плоскости. Дело в том, что существует такое понятие, как ошибки округления. Типа округленная сумма чисел может быть не равна сумме округленных чисел.
Round(0.4*20,0)=8 
Round(0.4,0)*20=0.
0.45 может быть частный случай, на который вы напоролись. И есть математические методы разрешения этих ошибок. Соответственно они приводят к написанию достаточно сложных собственных функций.
18 мар 05, 10:25    [1396670]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
LKO
Member

Откуда: Москва
Сообщений: 85
Округление:

при округлении числа до n знака после запятой рассматривается (n+1)-й знак.
Если он <5 - n-й знак остается без изменений
Если он >5 - n-й знак увеличивается на единицу
Если он =5, то в случае, если (n+1)-й знак последний значащий, то n-й знак остается без изменений, если нет, то n-й знак увеличивается на единицу.

Что касается различных результатов с одними и теми же (на первый взгляд) числами, то это может быть по причине разной реализации ф-ии округления и того факта, что числа с плавающей точкой редко бывают равны друг другу
18 мар 05, 12:28    [1397193]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Что такое "значащий знак"?
18 мар 05, 12:38    [1397242]     Ответить | Цитировать Сообщить модератору
 Re: И снова round  [new]
LKO
Member

Откуда: Москва
Сообщений: 85
GreenSunrise
Что такое "значащий знак"?


Не равный нулю
18 мар 05, 12:42    [1397265]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить