2015-05-20 20 views
10

Tôi thực sự phải đối mặt với một vấn đề lớn với một số trang web (thực sự 3) dựa trên Prestashop. Vấn đề là PHP hoặc Prestashop ngẫu nhiên làm tròn giá đến số nguyên gần nhất và nó là không có hệ thống.PHP - Vấn đề hành vi vòng ngẫu nhiên

Hầu hết thời gian, nó hoạt động hoàn hảo, nhưng đôi khi (có thể mất vài tuần hoặc vài tháng giữa hai vấn đề), giá được làm tròn. Tùy chọn chế độ tròn của tôi được đặt chính xác để hiển thị hai số thập phân.

Sự cố có thể xảy ra khi chỉnh sửa giá sản phẩm ở trụ sở chính hoặc khi khách hàng đang ở bước thanh toán.

Tôi đã cố gắng tạo lại sự cố, vì vậy tôi đã tạo một thử nghiệm cơ bản: Tôi truy xuất thông tin giỏ hàng và tôi hiển thị giá của nó. Tôi đã làm mới trang nhiều lần và tôi thấy giá được làm tròn chỉ vài lần. Điều hấp dẫn nhất là không phải bối cảnh cũng như mã đã thay đổi giữa phần đầu và phần kết thúc của bài kiểm tra.

Tôi đã tìm kiếm trợ giúp trên Google và dường như không ai có vấn đề này ...

Có ai gặp phải sự cố này không? Bạn có nghĩ rằng đó là một vấn đề PHP hoặc một Prestashop? Cảm ơn trước sự giúp đỡ của bạn.

Đây là mã của hàm tròn Prestashop đang sử dụng:

round($value, 2, PHP_ROUND_HALF_UP); 

Để biết thông tin, phiên bản của PHP 5.4.39.

+0

http://php.net/round - có 4 phương thức làm tròn. grep thông qua mã của prestashop để xem chúng đang sử dụng cái nào. –

+0

@MarcB Cảm ơn đề xuất của bạn, tôi đã cập nhật câu hỏi của mình với chức năng được Prestashop sử dụng. – Sebj

Trả lời

1

Hơn 2 năm sau, chúng tôi đã tìm ra vấn đề. Đó là do php5-fpm không xử lý các miền địa phương trên mỗi luồng nhưng theo quy trình. Điều này thực sự rõ ràng trong PHP documentation:

Cảnh báo Thông tin về miền địa phương được duy trì cho mỗi quy trình chứ không phải trên mỗi luồng. Nếu bạn đang chạy PHP trên một API máy chủ đa luồng như IIS, HHVM hoặc Apache trên Windows, bạn có thể gặp phải những thay đổi đột ngột trong cài đặt miền địa phương trong khi tập lệnh đang chạy, mặc dù bản thân tập lệnh không bao giờ được gọi là setlocale(). Điều này xảy ra do các tập lệnh khác chạy trong các luồng khác nhau của cùng một quá trình cùng một lúc, thay đổi ngôn ngữ toàn bộ quy trình bằng cách sử dụng setlocale().

Vì dấu phân tách thập phân đã thay đổi, PHP không nhận dạng số thập phân và cắt ngắn số của tôi.

0

Có thể có sự cố nếu giá có dấu phân cách nghìn như 12,300.20?

hãy có những điều sau:

Lưu ý: Chương trình PHP không xử lý chuỗi như "12,300.2" một cách chính xác theo mặc định. Xem chuyển đổi từ chuỗi.

Xem: http://php.net/round

0

Tôi gần như chắc chắn như thế nào nó các số dấu chấm động được lưu trữ trong máy tính hoặc một cái gì đó của bạn cùng những dòng này, mà có thể chỉ cho bạn đi đúng hướng.

http://php.net/manual/en/language.types.float.php

Kiểm tra này ra là tốt, giải thích về việc tại sao số dấu chấm động không luôn bằng khi bạn nghĩ rằng họ cần. http://docstore.mik.ua/orelly/webprog/pcook/ch02_03.htm#phpckbk-CHP-2-SECT-3

0

Có thể có vấn đề với ngôn ngữ. Ví dụ, ở Đức, hàng nghìn dấu tách và dấu thập phân là một cách khác. Nếu bạn không phải xử lý cẩn thận những người bạn có thể lưu trữ các giá trị sai trong một số kiên trì hoặc phá vỡ một số giá trị khi đúc nó để nổi. Hãy nhớ rằng - khi tính toán bằng các chuỗi (ví dụ: "2,55") php sẽ truyền chúng thành phao, xử lý các số đức ("2,55") sẽ dẫn đến số dấu phẩy động sai.

(float) "2.55" = 2.55 
(float) "2,55" = 2 

Sự cố có thể được khắc phục bằng cách định cấu hình đúng ngôn ngữ.

Nếu bạn có thể cho kết quả sai từ một giá trị tự động hợp lệ, bạn có thể muốn đăng nhập vào debug_backtrace tại điểm đó để đánh giá luồng chương trình trong trường hợp đó.

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