2012-02-06 24 views
6

Hy vọng chỉ là một câu hỏi nhanh. Tôi có một cột DECIMAL trong cơ sở dữ liệu của mình. Giá trị là một phần thập phân rất nhỏ - tổng giá trị này cho tất cả các hàng sẽ bằng 1.Loại dữ liệu MySQL Decimal được sử dụng như thế nào trong php?

Bây giờ tôi muốn sử dụng giá trị này trong ứng dụng php của tôi, hiển thị nó, thực hiện tính toán và lưu nó trở lại cơ sở dữ liệu.

Vì php chỉ có integerfloat loại, cách tốt nhất để sử dụng giá trị đó trong php để không mất bất kỳ độ chính xác nào trong tính toán hoặc hiển thị?

  • Giữ giá trị như là một chuỗi và sử dụng BC Math để tính toán
  • Cast số như float - Tôi biết nổi php là chính xác để một số lượng tốt (tùy thuộc vào hệ điều hành)
  • Chuyển đổi giá trị số nguyên sử dụng hàm ghi nhớ số mũ
  • Cái gì khác?

Cảm ơn

+0

Giữ nó như là một chuỗi sẽ bảo toàn độ chính xác, nhưng một khi bạn bắt đầu làm toán trên đó, tất cả các cược sẽ tắt. –

+3

Tôi muốn sử dụng [BC Math] (http://www.php.net/manual/en/intro.bc.php) –

Trả lời

0

Bạn nên đi cho float để không bị mất độ chính xác trong tính toán và sử dụng number_format đầu ra để hiển thị ...

Ghi chú:
Nó thực sự phụ thuộc vào nhu cầu của bạn và cách bạn muốn đầu ra của bạn được xử lý, nếu bạn chỉ muốn cắt mantissa sau số thứ hai hoặc làm một số loại làm tròn.

Với việc sử dụng của BC Math với quy mô 2 ví dụ 2.10/1.10 sản xuất 1.90 khi sử dụng number_format(2.10/1.10, 2) sẽ dẫn đến 1.91 (làm tròn kết quả giống như SELECT CAST(2.10/1.10 as DECIMAL(10,2)))

Cập nhật:. Như đã nêu trong các bình luận có thể có trường hợp bạn sẽ mất độ chính xác trong các phép tính. Sẽ tốt hơn nếu bạn thực hiện các phép tính tùy ý chính xác trong chính MySQL để bạn có thể chắc chắn không có gì bị mất trong các phép toán.

+0

Bất kỳ giải thích nào như tại sao và điều gì có thể xảy ra, ưu và khuyết điểm là gì? –

+1

Nếu @Bendos muốn làm số học chính xác tùy ý thì sử dụng các số dấu phẩy động không phải là một ý tưởng hay. Độ chính xác sẽ bị mất nếu một giai đoạn trong phép tính liên quan đến một số không thể được biểu diễn trong định dạng dấu chấm động. – Hammerite

+0

@Hammerite, cảm ơn. Tôi đã cập nhật câu trả lời của mình để lưu ý điều này –