2011-06-23 42 views
6

Độ chính xác được đảm bảo của toán tử nhân cho giá trị kép trong java là bao nhiêu? Ví dụ: 2.2 * 100 là 220.00000000000003, nhưng 220 là số kép. 220,00000000000003 là đôi tiếp theo sau khi 220.Độ chính xác của phép nhân đôi chính xác trong java?

+1

Daba: nó phụ thuộc vào số multiplicating của bạn, thấy cách số dấu chấm động được thực hiện trong Java (và trong hầu hết các ngôn ngữ). Các số dấu chấm động trong Java chủ yếu là IEEE-754. Tôi đề nghị đọc hấp dẫn sau đây: * "Mọi nhà khoa học máy tính nên biết gì về các số dấu phẩy động" * http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html Lưu ý " nhà khoa học "trong tên: nếu bạn không thực hiện tính toán khoa học, bạn có thể sai nếu bạn sử dụng các số dấu phẩy động. – SyntaxT3rr0r

+0

- tắt bởi một ulp! – Atreys

Trả lời

6

Các nhân đang làm việc tốt, nhưng 2.2 không thể được đại diện chính xác như một đôi. Nội dung đôi nam gần nhất là:

  • 2,199999999999999733 (0x4001999999999999)
  • 2,200000000000000177 (0x400199999999999a)

Một số phần mềm sẽ in giá trị sau khi 2.2, nhưng điều đó không có nghĩa là nó chính xác. Nó chỉ có nghĩa là nó được coi là "đủ gần".

+0

cảm ơn, tôi nhầm lẫn giả định rằng thực tế println in 2,2 có nghĩa là nó là chính xác –

3

Nếu bạn đang làm việc với các dữ liệu tài chính không sử dụng float or double chỉ cần sử dụng java.math.BigDecimal

+1

cảm ơn nhưng đây không phải là câu hỏi tôi đã hỏi –

+0

Bạn hỏi về nhiều lần, hãy thử thực hiện thao tác tương tự nhưng chỉ sử dụng BigDecimal và vấn đề của bạn sẽ được giải quyết. –

+1

câu hỏi của tôi là về tính chính xác của phép toán nhân, như tôi đã đọc trong [Điều mà mọi nhà khoa học máy tính nên biết về các số dấu phẩy động "] (http://download.oracle.com/docs/cd/E19957-01/806 -3568/ncg_goldberg.html) "Tiêu chuẩn IEEE yêu cầu kết quả phép cộng, trừ, nhân và chia được làm tròn chính xác. Tức là, kết quả phải được tính chính xác và sau đó được làm tròn đến số dấu phẩy động gần nhất (sử dụng vòng tới thậm chí). ", Tôi đã rất ngạc nhiên khi nhận được câu trả lời mà tôi đã không mong đợi. @duskwuff giải thích dưới đây tại sao điều này xảy ra. –

0

bạn có thể sử dụng BigDecimal, nhưng hãy chắc chắn rằng bạn sử dụng các cấu trúc của BigDecimal (String) hơn BigDecimal (double). Sự khác biệt giữa chúng là:

enter image description here

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