2015-04-08 23 views
5

Vì vậy, tôi có một tập lệnh Javascript có thêm phân số nhỏ với nhau trong một vòng lặp và có thể nó sẽ thêm 0,2 đến 0,1. Sau đó, giá trị đó được cấp cho một hàm khác nhưng vấn đề là tôi cần 0,3 để được cấp chính xác và không phải là 0,30000000000000004.Cách tốt nhất để xử lý các lỗi dấu phẩy động là gì?

Cách đơn giản nhất để đảm bảo số được sửa và chính xác là gì. Lưu ý rằng nó có thể để có được 0,25 + 0,125 vv được thêm vào đơn giản làm tròn đến 1 thập phân sẽ không khắc phục được vấn đề.

Cũng có thể có thêm 0,2 + 0,10000000000000004 mặc dù điều này rất, rất khó xảy ra!

+1

0,25 + 0,125 là trường hợp bất thường và đơn giản. Cả hai giá trị và tổng của chúng là chính xác, do đó không có lỗi làm tròn. Đó không phải là trường hợp cho 0,3. Gần nhất bạn có thể nhận được là 0.299999999999999988897769753748434595763683319091796875. Đủ gần chưa? –

+1

Đây không phải là giải pháp mà là toán học của bạn, chính xác hơn – Downgoat

+2

Số nhỏ của bạn được tạo ra như thế nào? bạn có thể tốt hơn nhân tất cả mọi thứ bằng '1000' –

Trả lời

1

Không có phương pháp đơn giản để tránh làm tròn lỗi trong số học dấu phẩy động đa năng. Số 0.3 không có biểu diễn dấu phẩy động nhị phân chính xác.

Tôi khuyên bạn nên đọc What Every Computer Scientist Should Know About Floating-Point Arithmetic để tự làm quen với các lần cân bằng cố hữu để biểu thị dấu phẩy động của số.

Để thực sự giải quyết vấn đề của bạn, bạn nên tự hỏi mình một số câu hỏi:

  • Làm thế nào nghiêm ngặt là yêu cầu của bạn cho chính xác? Tại sao là 0.30000000000000004 ngoài lề của bạn để báo lỗi? Có thể chấp nhận kết quả của bạn không?
  • Có cách nào bạn có thể đại diện cho số của bạn và thực hiện hầu hết số học của bạn với số nguyên không? Ví dụ. nếu bạn biết rằng bạn sẽ chỉ gặp số hữu tỉ, chúng có thể được biểu diễn bằng cách sử dụng một số nguyên và một mẫu số nguyên. Từ đó, bạn có thể cố gắng trì hoãn quá trình truyền tới phao càng lâu càng tốt để tránh các lỗi làm tròn tích lũy.
  • Nếu bạn không thể thực hiện các phép tính của mình trên các số nguyên, có một loại dữ liệu thay thế mà bạn có thể sử dụng, chẳng hạn như BigDecimal không?

Cuối cùng, khi nói đến các vấn đề với độ chính xác dấu phẩy động, bạn thường phải điều chỉnh giải pháp cho các yêu cầu đặt ra bởi vấn đề cụ thể của bạn.

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