Bcmath trong PHP là gì?
Mở rộng thư viện php BCMath cho các chức năng bị thiếu như sàn, trần, tròn, abs, min, max, rand cho các số lớn. Cũng bọc các chức năng BCMath hiện có. (thêm http. //php. net/manual/en/book. bc. php) Show composer require krowinski/bcmath-extendedĐặc trưng
Kể từ ngày 7. 2 float có thể được chuyển đến bcmod, nhưng chúng không trả về giá trị chính xác (IMO) Tôi đã tạo lỗi cho điều này trong https. // lỗi. php. mạng/lỗi. php?id=76287, nhưng nó đã được nhận xét là vấn đề về tài liệu không phải lỗi PHP (từ viết tắt đệ quy của PHP. Bộ tiền xử lý siêu văn bản) là ngôn ngữ kịch bản mã nguồn mở có mục đích chung được sử dụng rộng rãi, đặc biệt phù hợp để phát triển web và có thể được nhúng vào HTML Khi xử lý các số điểm cố định, bạn phải rất cẩn thận – đặc biệt nếu bạn phát triển bằng PHP và MySQL. Trong bài viết này, các trở ngại và sự phức tạp khi làm việc với phần mở rộng PHP BCMath, xử lý biểu thức điểm cố định của MySQL và duy trì dữ liệu điểm cố định từ PHP sang MySQL được mô tả. Bất chấp những rào cản đang xảy ra, chúng tôi cố gắng tìm ra cách làm việc với các số điểm cố định và không để mất một chữ số nào Rắc rối với BCMathTài liệu BCMath nói
Vì vậy, các tham số hàm BCMath phải được biểu diễn dưới dạng chuỗi. Việc chuyển các giá trị số cho 2 có thể dẫn đến kết quả sai, mất độ chính xác tương tự như khi chúng ta coi giá trị kép là chuỗiTrường hợp 1
Kết quả là
Không bao giờ chuyển các giá trị số cho các hàm BCMath, chỉ các giá trị chuỗi đại diện cho các số. Ngay cả khi không xử lý các điểm động, BCMath có thể tạo ra các kết quả lạ trường hợp 2
Kết quả là
Lý do cho điều này là BCMath chuyển đổi các đối số của nó thành chuỗi và có những trường hợp biểu diễn chuỗi của một số có ký hiệu hàm mũ Trường hợp 3
PHP là một ngôn ngữ được gõ yếu và trong một số trường hợp, bạn không thể kiểm soát đầu vào một cách chặt chẽ – bạn muốn xử lý càng nhiều yêu cầu càng tốt Ví dụ: chúng ta có thể “sửa chữa” Trường hợp 2 và Trường hợp 3 bằng cách áp dụng biến đổi 3________số 8nhưng việc áp dụng cùng một phép biến đổi có thể phá vỡ hành vi “đúng đắn” của Trường hợp 1
Vì vậy lời giải của 3 không phù hợp với BCmath. Giả sử tất cả đầu vào của người dùng là chuỗi, chúng tôi có thể triển khai trình xác thực đơn giản, nắm bắt tất cả các số ký hiệu hàm mũ và chuyển đổi chúng đúng cách. Kỹ thuật này được thực hiện trong php-bignumbers, vì vậy chúng ta có thể chuyển các đối số như 5 và 6 một cách an toàn mà không làm mất đi độ chính xác 3Nhưng hai dòng cuối cùng của ví dụ cho chúng ta thấy rằng không thể tránh được các cảnh báo về dấu phẩy động bằng cách phân tích cú pháp đầu vào (điều này hoàn toàn hợp lý – chúng ta không thể xử lý biểu diễn kép bên trong PHP) hướng dẫn cuối cùng của BCMathKhông bao giờ sử dụng số dấu phẩy động làm đối số hoạt động của điểm cố định. Chuyển đổi chuỗi không giúp được gì, vì chúng tôi không thể quản lý việc mất độ chính xác theo bất kỳ cách nào Khi sử dụng các phép toán mở rộng BCMath, hãy cẩn thận với các đối số trong biểu diễn hàm mũ. Các hàm BCMath không xử lý các đối số hàm mũ (i. e. '1e-8') một cách chính xác, vì vậy bạn nên chuyển đổi chúng theo cách thủ công. Hãy cẩn thận, không sử dụng 3 hoặc các kỹ thuật chuyển đổi tương tự, vì nó dẫn đến mất độ chính xácBạn có thể sử dụng thư viện php-bignumbers xử lý các đối số đầu vào ở dạng hàm mũ và cung cấp cho người dùng các hàm phép toán điểm cố định. Tuy nhiên, hiệu suất của nó kém hơn so với tiện ích mở rộng BCMath, do đó, đây là một kiểu thỏa hiệp giữa gói mạnh mẽ và hiệu suất MySQL và số điểm cố địnhTrong MySQL, số điểm cố định được xử lý với loại cột 8. Bạn có thể đọc tài liệu MySQL chính thức để biết các loại dữ liệu và phép toán chính xácPhần thú vị nhất là cách MySQL xử lý các biểu thức
Đây là một ví dụ ngắn thể hiện các trường hợp phần phân số 6Nó có thể thấy khá đơn giản, nhưng hãy xem cách xử lý nó trong PHP Toán chính xác trong PHP & MySQLVì vậy, bây giờ chúng ta phải duy trì các giá trị điểm cố định của mình từ PHP vào MySQL. Cách đúng đắn là sử dụng các câu lệnh và trình giữ chỗ đã chuẩn bị sẵn trong các truy vấn của chúng tôi. Sau đó, chúng tôi thực hiện ràng buộc tham số và mọi thứ đều an toàn và bảo mật 7Khi chúng tôi liên kết một giá trị với một trình giữ chỗ câu lệnh, chúng tôi có thể chỉ định loại của nó bằng đối số thứ ba 9. Các kiểu có thể được biểu diễn bằng các hằng số 0, 1, 2, 3, 4 và 5. Vì vậy, vấn đề là phần mở rộng PHP PDO không có loại tham số thập phân để liên kết. Kết quả là, tất cả các biểu thức toán học trong các truy vấn được coi là biểu thức dấu phẩy động, không phải là biểu thức dấu phẩy động 0Nếu chúng ta muốn tận dụng các câu lệnh đã chuẩn bị sẵn và làm việc với các số điểm cố định, cách tốt nhất là thực hiện tất cả các phép toán trong PHP và lưu kết quả vào MySQL 1Phần kết luậnChúng tôi đã đi đến kết luận sau
Cách tiếp cận yêu thích cá nhân của tôi là cách đầu tiên. tất cả các phép toán trong PHP. Tôi đồng ý rằng PHP và MySQL có thể không phải là lựa chọn tốt nhất cho các ứng dụng có toán học chính xác, nhưng nếu bạn chọn ngăn xếp công nghệ này, thật tốt khi biết rằng có một cách để giải quyết nó đúng cách Chia sẻ bài viết nàyAleksey Asiutin Aleksey là Kỹ sư phần mềm chuyên nghiệp đến từ Ukraine với bằng Thạc sĩ Toán ứng dụng. Anh ấy đã làm việc ở nhiều vị trí khác nhau từ nhà phát triển frontend cấp dưới đến trưởng bộ phận phát triển. Bây giờ anh ấy đang làm việc trong công ty sản phẩm về các dự án Bitcoin và giảng dạy Khoa học Máy tính tại Đại học Kỹ thuật Quốc gia ở Kharkov, Ukraine. Anh ấy thích đóng góp cho các dự án nguồn mở và học hỏi những điều mới (Coursera và Edx là những địa điểm yêu thích của anh ấy) |