Theo Tài liệu Oracle:
Đây là cách tôi thấy nó:
- Khi
Precision
lớn hơn Quy mô (ví dụ:NUMBER(8,5)
), không có vấn đề, điều này là đơn giản.Precision
có nghĩa là số sẽ có tổng cộng 8 chữ số, trong đó 5 chữ số ở phần phân số (. →), vì vậy phần nguyên (←.) sẽ có 3 chữ số. Điều này thật dễ dàng. -
Khi bạn thấy
Precision
đó nhỏ hơnScale
(ví dụ:NUMBER(2, 5)
), điều này có nghĩa là 3 điều:- Số sẽ không có bất kỳ phần nguyên nào, chỉ có phần phân số. Vì vậy, số 0 trong phần nguyên không được tính trong các phép tính, bạn nói .12345 không phải 0,12345. Trên thực tế, nếu bạn chỉ định 1 chữ số trong phần nguyên, nó sẽ luôn trả về lỗi.
-
Scale
đại diện cho tổng số chữ số trong phần phân số mà số đó sẽ có. 5 trong trường hợp này. Vì vậy, nó có thể là .12345 hoặc .00098 nhưng tổng cộng không quá 5 chữ số. - Phần phân số được chia thành 2 phần, số có nghĩa và số không. Các con số quan trọng được chỉ định bởi
Precision
và số lượng số không tối thiểu bằng (Scale
-Precision
). Ví dụ:
ở đây Số sẽ phải có tối thiểu 3 số không trong phần phân số. theo sau là 2 số có nghĩa (cũng có thể có số 0). Vì vậy, 3 số không + 2 số có nghĩa =5 là
Scale
số.
Tóm lại, khi bạn thấy ví dụ:NUMBER(6,9)
, điều này cho chúng ta biết rằng phần phân số sẽ có tổng cộng 9 chữ số, bắt đầu bằng 3 số 0 bắt buộc và tiếp theo là 6 chữ số.
Dưới đây là một số ví dụ:
SELECT CAST(.0000123 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012300
SELECT CAST(.000012345 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012345
SELECT CAST(.123456 AS NUMBER(3,4)) FROM dual; -- ERROR! must have a 1 zero (4-3=1)
SELECT CAST(.013579 AS NUMBER(3,4)) FROM dual; -- prints: 0.0136; max 4 digits, .013579 rounded to .0136