PostgreSQL не определяет round(double precision, integer)
. По причинам, которые @Catcall объясняет в комментариях, версия раунда, которая принимает точность, доступна только для numeric
.
regress=> SELECT round( float8 '3.1415927', 2 );
ERROR: function round(double precision, integer) does not exist
regress=> \df *round*
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+--------+------------------+---------------------+--------
pg_catalog | dround | double precision | double precision | normal
pg_catalog | round | double precision | double precision | normal
pg_catalog | round | numeric | numeric | normal
pg_catalog | round | numeric | numeric, integer | normal
(4 rows)
regress=> SELECT round( CAST(float8 '3.1415927' as numeric), 2);
round
-------
3.14
(1 row)
(В приведенном выше примечании обратите внимание, что float8
является просто сокращенным псевдонимом для double precision
. Вы можете видеть, что PostgreSQL расширяет его на выходе).
Вы должны указать значение, округленное до numeric
, для использования двухфакторной формы round
. Просто добавьте ::numeric
для стенографического броска, например round(val::numeric,2)
.
Если вы форматируете для отображения пользователю, не используйте round
. Используйте to_char
(см. функции форматирования типа данных в руководстве), который позволяет указать формат и дает результат text
, на который не влияет какая бы странность, на которую может повлиять ваш язык клиента с значениями numeric
. Например:
regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
to_char
---------------
3.14
(1 row)
to_char
будет округлять числа для вас как часть форматирования. Префикс FM
сообщает to_char
, что вы не хотите добавлять пробелы с ведущими пробелами.
События всплывают в наивысшую точку в DOM, к которой было прикреплено событие щелчка. Итак, в вашем примере, даже если у вас не было других явно кликабельных элементов в div, каждый дочерний элемент div будет пузырить свое событие щелчка вверх по DOM до тех пор, пока его не улавливает обработчик события щелчка DIV.
два решения - проверить, кто на самом деле инициировал событие. jQuery передает объект eventargs вместе с событием:
$("#clickable").click(function(e) {
var senderElement = e.target;
// Check if sender is the <div> element e.g.
// if($(e.target).is("div")) {
window.location = url;
return true;
});
Вы также можете прикрепить обработчик события щелчка к вашим ссылкам, который сообщит им остановить всплытие событий после выполнения их собственного обработчика:
$("#clickable a").click(function(e) {
// Do something
e.stopPropagation();
});
Встроенная альтернатива:
<div>
<!-- Other content. -->
<a onclick='event.stopPropagation();' href="http://foo.com">I don't want #clickable to handle this click event.</a>
</div>
<a onclick="return false;" href="http://foo.com">I want to ignore my parent's onclick event.</a>
добавить a
следующим образом:
<a href="http://foo.com" onclick="return false;">....</a>
или return false;
из обработчика кликов для #clickable
, например:
$("#clickable").click(function() {
var url = $("#clickable a").attr("href");
window.location = url;
return false;
});
Используйте метод stopPropagation , см. Пример:
$("#clickable a").click(function(e) {
e.stopPropagation();
});
Как сказано в документации jQuery:
метод stopPropagation
предотвращает всплытие события в DOM tree, не позволяя родительским обработчикам получать уведомления о событии.
Имейте в виду, что это не запрещает другим слушателям обрабатывать это событие (например, более одного обработчика щелчка для кнопки), если это нежелательный эффект, вместо него вы должны использовать stopImmediatePropagation
.
Вам нужно остановить событие от достижения (всплытия) родителя (div). См. Часть о всплытии здесь и информацию об API для jQuery здесь .