2010-01-29 28 views
10

Trong một dự án trước, tôi nhận thấy rằng trường giá đã được lưu trữ dưới dạng int, chứ không phải là một phao. Điều này được thực hiện bằng cách nhân giá trị thực tế với 100, lý do là tránh chạy vào các vấn đề dấu chấm động.Tôi có nên lưu trữ một trường PRICE dưới dạng int hoặc dưới dạng float trong cơ sở dữ liệu không?

Đây có phải là phương pháp hay mà tôi nên tuân thủ hoặc không cần thiết và chỉ làm cho dữ liệu ít minh bạch hơn?

Trả lời

12

Câu hỏi thú vị.

Tôi sẽ không thực sự chọn nổi trong môi trường mysql. Quá nhiều vấn đề trong quá khứ với độ chính xác với kiểu dữ liệu đó.

Với tôi, lựa chọn sẽ nằm giữa intdecimal(18,4).

Tôi đã xem các số nguyên ví dụ thế giới thực được sử dụng để biểu thị các giá trị dấu phẩy động. Các bên trong của JD Edwards datatables tất cả làm điều này. Số lượng thường được chia cho 10000. Trong khi tôi chắc chắn rằng nó nhanh hơn và nhỏ hơn trong bảng, nó chỉ có nghĩa là chúng ta luôn phải CAST ints đến một giá trị thập phân nếu chúng ta muốn làm bất cứ điều gì với họ, đặc biệt là phân chia.

Từ góc độ lập trình, tôi luôn muốn làm việc với decimal để biết giá (hoặc money trong RDBMS hỗ trợ nó).

+1

tôi đã quyết định giữ cho nó đơn giản và chỉ cần đi với số thập phân –

0

Mặc dù nó sẽ giúp bạn tiết kiệm các vấn đề liên quan đến float, nhưng giá được lưu dưới dạng số nguyên có thể dẫn đến sự cố trong đó bạn sẽ tính phí gấp 100 lần giá cho khách hàng. Nó cũng có thể gây nhầm lẫn cho các lập trình viên khác.

Tôi đã thấy cả hai giải pháp được sử dụng thành công trên các trang web thương mại điện tử có kích thước trung bình, nhưng sở thích của tôi là sử dụng các phao nổi.

1

Tôi nghĩ rằng Decimal là điều tốt cho việc sử dụng này.

2

Lỗi dấu chấm động có thể khiến bạn gặp sự cố nếu bạn đang nhân các số lớn. Nói chung, các phép tính tài chính không bao giờ được thực hiện với các số dấu phẩy động khi có thể.

Các vấn đề liên quan