Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Округление
 
 автор: ronin80   (08.06.2010 в 09:42)   письмо автору
 
 

Здравствуйте, вопрос по округлению decimal полей. Существует две связанных по double ключу таблицы, в них есть поля massa с типом decimal (10,4)

при запросе

select round( (table1.massa-(select sum(table2.massa*0.2) from table2 where table2.id=table1.id)) ,2) as massa

выдаёт значение 3.24, если убрать округление выдаёт значение 3.24490000000

почему так округляет?

p.s. сделал такую схему round(round((выражение),3),2) т.е. последовательное округление сначала до трёх знаков, затем до двух и округлять стал как надо, но это как-то не айс по-моему

  Ответить  
 
 автор: Valick   (08.06.2010 в 10:23)   письмо автору
 
   для: ronin80   (08.06.2010 в 09:42)
 

почему так округляет?
потому что так и должно округлять
от 0 до 4 округляет в меньшую сторону, а от 5 до 9 в большую сторону
Следует учитывать, что поведение функции ROUND() при значении аргумента, равном середине между двумя целыми числами, 
зависит от конкретной реализации библиотеки C. Округление может выполняться: к ближайшему четному числу, всегда к ближайшему 
большему, всегда к ближайшему меньшему, всегда быть направленным к нулю. Чтобы округление всегда происходило только в одном 
направлении, необходимо использовать вместо данной хорошо определенные функции, такие как TRUNCATE() или FLOOR().


http://www.rldp.ru/mysql/mysqlpro/math.htm

  Ответить  
 
 автор: ronin80   (08.06.2010 в 10:51)   письмо автору
 
   для: Valick   (08.06.2010 в 10:23)
 

т.е. при округлении до двух сотых сервер не учитывает девятку? ведь по математике будет 3.25 а не 3.24

  Ответить  
 
 автор: Valick   (08.06.2010 в 10:55)   письмо автору
 
   для: ronin80   (08.06.2010 в 10:51)
 

с какого перепугу он будет учитывать девятку если там четверка
а вот когда Вы округляете до трех знаков то девятка делает из четверки пятерку, что в последствии округляет вашу четверку до пяти)
___
ведь по математике будет
кстати, что у Вас было по математике?)

  Ответить  
 
 автор: Trianon   (08.06.2010 в 10:52)   письмо автору
 
   для: ronin80   (08.06.2010 в 09:42)
 

f а олько он должен выдавать, с Вашей точки зрения, и почему?
По-моему, всё корректно.

  Ответить  
 
 автор: ronin80   (08.06.2010 в 10:56)   письмо автору
 
   для: Trianon   (08.06.2010 в 10:52)
 

простите меня конечно, может я не прав, но при округлении 3.2449 до двух знаков равно 3.25, разве нет?

  Ответить  
 
 автор: Valick   (08.06.2010 в 10:59)   письмо автору
 
   для: ronin80   (08.06.2010 в 10:56)
 

нет 3.2449 -> 3.245 -> 3.24 -> 3.2 -> 3

  Ответить  
 
 автор: ronin80   (08.06.2010 в 11:03)   письмо автору
 
   для: Valick   (08.06.2010 в 10:59)
 

>нет 3.2449 -> 3.245 -> 3.24 -> 3.2 -> 3

почему на втором этапе не соблюдается принцип округления применяемый на остальных этапах округления?

p.s. нашёл в сети вот такое

Используя функцию, приведённую ниже, можно округлить число типа double с требуемой точностью. Округлять можно по двум правилам:
1) то, чему нас учили в школе: если округляем до двух знаков после запятой, то сотые доли либо увеличиваются на 1, либо остаются без изменений - в зависимости от значений тысячных (если 4 тысячных - то оставляем сотые как есть, если больше 5-ти - увеличиваем сотые на 1, если 5 - то смотрим десятитысячные), все цифры правее сотых - отбрасываются;
2) простое отбрасывание всех цифр, правее указанной (если округляем до сотых, то тысячные и т.п. -- отбрасываются).


в wiki вообще сказано

В разных сферах могут применяться различные методы округления. Во всех этих методах «лишние» знаки обнуляют (отбрасывают), а предшествующий им знак корректирует по какому-либо правилу.


т.е. получается если я округляю это число до десятых я не должен учитывать 9ку?

  Ответить  
 
 автор: Valick   (08.06.2010 в 11:32)   письмо автору
 
   для: ronin80   (08.06.2010 в 11:03)
 

почему на втором этапе не соблюдается принцип округления применяемый на остальных этапах округления?
я немного не так выразился
3.2449 - 3.245
3.2449 - 3.24
3.2449 - 3.2
3.2449 - 3
если до сотых то 9-ка не учитывается
если до тысячных, то учитывается
и в школе учили именно так ;)

  Ответить  
 
 автор: ronin80   (08.06.2010 в 11:38)   письмо автору
 
   для: Valick   (08.06.2010 в 11:32)
 

>и в школе учили именно так ;)

чёрт, наверное я её слишком давно закончил, не помню :) спасибо за ответ

  Ответить  
 
 автор: neadekvat   (08.06.2010 в 13:23)   письмо автору
 
   для: Valick   (08.06.2010 в 10:59)
 

нет 3.2449 -> 3.245 -> 3.24 -> 3.2 -> 3
Вот если 3.245 округлять до сотых, то как раз таки 3.25 получится.

  Ответить  
 
 автор: Valick   (08.06.2010 в 13:37)   письмо автору
 
   для: neadekvat   (08.06.2010 в 13:23)
 

см. поправку :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования