2011-01-11 32 views
18

Tôi đã lo lắng về cách xử lý hiển thị tiền tệ và toán học trong PHP, và trong một thời gian dài đã được lưu trữ trong MySQL bằng cách sử dụng loại DECIMAL và sử dụng money_format() để định dạng nó để hiển thị trên trang web. Tuy nhiên, hôm nay tôi đã xem mẫu thử nghiệm thực tế:Nếu xử lý tiền trong một phao là xấu, thì tại sao money_format() làm điều đó?

string money_format (string $format , float $number) 

Tôi hơi bối rối một chút. Tất cả những gì tôi được bảo là tránh nổi tiền! Nhưng ở đây nó là, chức năng định dạng cơ bản (nói rằng năm lần nhanh), đúc đầu vào cho một phao. number_format() cũng vậy.

Vì vậy, câu hỏi của tôi là:

  1. Trừ khi tôi đang đối phó với xu phân đoạn hoặc hàng nghìn tỷ đô la (và tôi đang đối phó với không), tôi nên quan tâm chút nào về hiển thịlưu trữ (nhưng không bao giờ làm toán) tiền tệ được đúc thành một phao? Tôi có bao giờ đến gần khu vực có điểm không chính xác nổi thay đổi số liệu của tôi không?

  2. Nếu câu trả lời cho # 1 là tôi thực sự nên quan tâm, thì tại sao là money_format() được xây dựng theo cách này?

+5

Hầu hết nguy cơ chuyển đổi nổi đến từ khi thực hiện toán học với các phao đó. 'number_format()' chỉ đơn giản là thực hiện chuyển đổi kiểu "in đẹp", vì vậy bất kỳ số thập phân lặp lại kỳ lạ nào được tạo ra bởi quá trình float-ification rất khó có thể ảnh hưởng đến kết quả. –

+20

PHP hầu như không phải là hình ảnh thu nhỏ của "các phương pháp hay nhất". – Gabe

+0

những gì @markb nói. – time4tea

Trả lời

19

Trừ khi tôi đang đối phó với phân đoạn cent, tương đương hàng nghìn tỷ đô la (và tôi đối phó với không), tôi nên quan tâm ở tất cả về hiển thị và lưu trữ (nhưng không bao giờ làm toán on) loại tiền tệ được đúc thành một phao? Tôi có bao giờ đến gần khu vực của có điểm nổi không chính xác thay đổi số liệu của tôi?

Vì mục đích làm tròn/hiển thị thuần túy, bạn sẽ an toàn miễn là lỗi biểu diễn dấu phẩy động tuyệt đối nhỏ hơn $ 0,005 (để làm tròn đến xu gần nhất là chính xác).

Với độ chính xác duy nhất IEEE 754, bạn được an toàn tối đa $ 131,072.00. (131.072,01 đô la được thể hiện là 131072,015625, được làm tròn không chính xác.)

Độ chính xác kép (trong đó PHP float sử dụng) không thất bại cho đến $ 70,368,744,177,664,01 (cũng có 0,015625 xu). Bạn không có gì phải lo lắng.

Nếu câu trả lời cho # 1 là tôi nên quan tâm, thì tại sao money_format() được xây dựng theo cách này?

Loại nào cần phải mất? PHP không có kiểu thập phân được cài sẵn. Cũng không làm nhiều ngôn ngữ khác.

Điều này được thảo luận trong “Why are floating-point values so prolific?”

+0

Chuỗi âm thanh như là một ý tưởng tốt như bất kỳ. Mặc dù nó bắt đầu phát ra âm thanh ngày càng giống như, đối với các vấn đề đại diện thuần túy và không phải là toán học, tôi nên hoàn toàn thoải mái với một phao. Được chấp nhận vì nó đã làm hỏng nỗi sợ của tôi và được +1 cho liên kết giáo dục. :) – Andrew

+1

Bạn nói "Không thất bại cho đến ..." nhưng những thứ như lãi kép? Các lỗi nhỏ có thể tăng lên. – rjmunro

+0

OP hỏi về hiển thị và lưu trữ, không phải toán học. – dan04

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