Tôi có một bảng tính .xlsx với một số duy nhất trong ô trên cùng bên trái của tờ 1.Matching điểm nổi của Excel trong Java
Các Excel UI hiển thị:
-130.98999999999
này hiển thị trong các thanh công thức, tức là không bị ảnh hưởng bởi số vị trí thập phân mà ô chứa được đặt để hiển thị. Đó là số chính xác nhất Excel sẽ hiển thị cho ô này.
Trong XML cơ bản, chúng ta có:
<v>-130.98999999999069</v>
Khi cố gắng để đọc các bảng tính với Apache POI, nó feeds số từ XML thông qua Double.valueOf và đi kèm với:
-130.9899999999907
Thật không may, đây không phải là số mà người dùng có thể thấy trong Excel. Bất cứ ai có thể chỉ cho tôi một thuật toán để có được cùng một số người dùng nhìn thấy trong Excel?
Nghiên cứu của tôi cho đến nay cho thấy định dạng tệp Excel 2007 sử dụng phiên bản tiêu chuẩn không phải là điểm nổi IEE754, nơi không gian giá trị khác nhau. Tôi tin vào điểm nổi của Excel, con số này nằm ở phía bên kia của ranh giới để làm tròn và do đó đi ra như thể được làm tròn thay vì lên.
Vấn đề của tôi không chính xác, đó là cách mô phỏng giải thích số của Excel. Sử dụng BigDecimal giữ nguyên số lượng như được báo cáo ở định dạng tệp, nhưng nó không giúp tôi gần gũi hơn với hành vi của Excel. –
@DavidNorth Vâng, một khi bạn có số là một 'BigDecimal' bạn có thể làm tròn số bất kỳ số thập phân nào (đây là những gì Excel trình bày trực quan cho người dùng, có vẻ như, 11 vị trí thập phân trong ví dụ cụ thể của bạn). Nói chung, cố gắng "mô phỏng hành vi của Excel" không phải là cách để đi, tôi nghĩ;) –
Tôi sẽ phải thêm một số ví dụ nữa, nhưng khó khăn chúng tôi đang gặp là không có thuật toán làm tròn đơn nào mà chúng ta có thể tìm thấy sử dụng BigDecimal khớp với Excel trong mọi trường hợp. Đối với không cố gắng để mô phỏng hành vi của Excel: khó khăn là người dùng của tôi có thể nhìn thấy một số trong Excel và muốn tôi cho họ thấy cùng một số khi tôi tiêu thụ bảng tính. Không phải là không hợp lý của họ, ngay cả khi Microsoft đang cố hết sức để làm cho nó không thể ... –