real
là một loại dấu phẩy động mất mát, không chính xác. Nó chỉ sử dụng 4 byte để lưu trữ và không thể lưu trữ các ký tự số được trình bày một cách chính xác để bắt đầu. Ngoài ra, chi tiết triển khai phụ thuộc vào nền tảng của bạn. Hãy xem xét chương "Các loại dấu chấm động" trong hướng dẫn sử dụng.
Không có gì sai với round()
hoặc cast()
. Để có kết quả chính xác, bạn phải sử dụng numeric
để bắt đầu.
Kiểm tra chức năng
CREATE OR REPLACE FUNCTION test3()
RETURNS void AS
$func$
DECLARE
r record;
BEGIN
FOR r IN
SELECT abs_km AS km
,cast(abs_km AS numeric) AS km_cast
,round(abs_km::numeric, 2) AS km_round
FROM gps_entry
LOOP
RAISE NOTICE 'km: % , km_cast: % , km_round: %'
, r.km, r.km_cast, r.km_round;
INSERT INTO test (km, casting, rounding)
VALUES (r.km, r.km_cast, r.km_round);
END LOOP;
END
$func$ LANGUAGE plpgsql;
- Không trích dẫn tên ngôn ngữ
plpgsql
. Đó là một số nhận dạng. -
Không có ý nghĩa gì khi làm tròn thành 2 chữ số thập phân sau truyền sang
numeric(16,2)
, vòng cưỡng bức đã có. Hoặc - hoặc ..round(abs_km:: numeric(16,2), 2) as roundround(abs_km::numeric, 2) as round abs_km::numeric(16,2) as round
Cuối cùng, bạn cần nâng cấp lên phiên bản hiện tại. Postgres 8.3 đã đạt đến EOL và không được hỗ trợ.