|
|
|
| Здравствуйте, вопрос по округлению 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) т.е. последовательное округление сначала до трёх знаков, затем до двух и округлять стал как надо, но это как-то не айс по-моему | |
|
|
|
|
|
|
|
для: ronin80
(08.06.2010 в 09:42)
| | почему так округляет?
потому что так и должно округлять
от 0 до 4 округляет в меньшую сторону, а от 5 до 9 в большую сторону
Следует учитывать, что поведение функции ROUND() при значении аргумента, равном середине между двумя целыми числами,
зависит от конкретной реализации библиотеки C. Округление может выполняться: к ближайшему четному числу, всегда к ближайшему
большему, всегда к ближайшему меньшему, всегда быть направленным к нулю. Чтобы округление всегда происходило только в одном
направлении, необходимо использовать вместо данной хорошо определенные функции, такие как TRUNCATE() или FLOOR().
|
http://www.rldp.ru/mysql/mysqlpro/math.htm | |
|
|
|
|
|
|
|
для: Valick
(08.06.2010 в 10:23)
| | т.е. при округлении до двух сотых сервер не учитывает девятку? ведь по математике будет 3.25 а не 3.24 | |
|
|
|
|
|
|
|
для: ronin80
(08.06.2010 в 10:51)
| | с какого перепугу он будет учитывать девятку если там четверка
а вот когда Вы округляете до трех знаков то девятка делает из четверки пятерку, что в последствии округляет вашу четверку до пяти)
___
ведь по математике будет
кстати, что у Вас было по математике?) | |
|
|
|
|
|
|
|
для: ronin80
(08.06.2010 в 09:42)
| | f а олько он должен выдавать, с Вашей точки зрения, и почему?
По-моему, всё корректно. | |
|
|
|
|
|
|
|
для: Trianon
(08.06.2010 в 10:52)
| | простите меня конечно, может я не прав, но при округлении 3.2449 до двух знаков равно 3.25, разве нет? | |
|
|
|
|
|
|
|
для: ronin80
(08.06.2010 в 10:56)
| | нет 3.2449 -> 3.245 -> 3.24 -> 3.2 -> 3 | |
|
|
|
|
|
|
|
для: 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ку? | |
|
|
|
|
|
|
|
для: ronin80
(08.06.2010 в 11:03)
| | почему на втором этапе не соблюдается принцип округления применяемый на остальных этапах округления?
я немного не так выразился
3.2449 - 3.245
3.2449 - 3.24
3.2449 - 3.2
3.2449 - 3
если до сотых то 9-ка не учитывается
если до тысячных, то учитывается
и в школе учили именно так ;) | |
|
|
|
|
|
|
|
для: Valick
(08.06.2010 в 11:32)
| | >и в школе учили именно так ;)
чёрт, наверное я её слишком давно закончил, не помню :) спасибо за ответ | |
|
|
|
|
|
|
|
для: Valick
(08.06.2010 в 10:59)
| | нет 3.2449 -> 3.245 -> 3.24 -> 3.2 -> 3
Вот если 3.245 округлять до сотых, то как раз таки 3.25 получится. | |
|
|
|
|
|
|
|
для: neadekvat
(08.06.2010 в 13:23)
| | см. поправку :) | |
|
|
|