Tại sao khi tôi lưu giá trị nói 40,54 trong SQL Server thành một cột kiểu Thực sự nó trả lại cho tôi một giá trị lớn hơn 40,53999878999 thay vì 40,54? Tôi đã nhìn thấy điều này một vài lần nhưng chưa bao giờ tìm ra lý do tại sao nó xảy ra. Có ai khác gặp vấn đề này và nếu có thì sẽ gây ra vấn đề này?Thực so với điểm nổi so với tiền
Trả lời
Hãy xem What Every Computer Scientist Should Know About Floating Point Arithmetic.
Số dấu chấm động trong máy tính không đại diện chính xác phần thập phân. Thay vào đó, chúng đại diện cho các phân số nhị phân. Hầu hết các số phân số không có biểu diễn chính xác dưới dạng phần nhị phân, do đó, có một số làm tròn đang diễn ra. Khi một phần nhị phân tròn như vậy được dịch ngược lại thành một phần thập phân, bạn sẽ có được hiệu ứng mà bạn mô tả.
Để lưu trữ giá trị tiền, cơ sở dữ liệu SQL thường cung cấp loại DECIMAL lưu trữ số thập phân chính xác. Định dạng này hơi kém hiệu quả đối với các máy tính để xử lý, nhưng nó khá hữu ích khi bạn muốn tránh các lỗi làm tròn số thập phân.
Trên thực tế, tốc độ * chậm hơn đáng kể đối với máy tính (khoảng 10 lần, do thiếu hỗ trợ phần cứng), nhưng sự chậm chạp không quan trọng đối với hầu hết các ứng dụng vì các thao tác số không ở gần nút cổ chai. – crazy2be
Số dấu chấm động không đại diện cho ** một số ** phân số thập phân chính xác. Số thực trong đời thực cũng không đại diện cho * một số * phân số chính xác. Ví dụ, '1/2' có thể được biểu diễn chính xác trên cả hai hệ thống. – axiac
Số dấu chấm động sử dụng phân số nhị phân và chúng không tương ứng chính xác với phân số thập phân.
Để kiếm tiền, tốt hơn là lưu trữ số xu dưới dạng số nguyên hoặc sử dụng loại số thập phân. Ví dụ: Thập phân (8,2) lưu trữ 8 chữ số bao gồm 2 chữ số thập phân (xxxxxx.xx), tức là độ chính xác cent.
Tôi muốn cả hai bạn có được điểm để trả lời tốt. Thay vì lưu trữ các xu, chúng tôi đang sử dụng giá trị themoney. Bạn có nghĩ rằng đây cũng là một thực hành tốt? – Middletone
Lưu trữ xu là tin xấu. Các tổ chức tài chính thường sử dụng xu phân số trong tính toán, và đôi khi cũng cần lưu trữ chúng. Tôi đã từng tham gia một dự án khi điều này xuất hiện sau khi ứng dụng lưu trữ xu được triển khai. Rất xấu. – MusiGenesis
Chỉ cần một lưu ý, không phải là thập phân (8,2) thực sự xxxxxx.xx thay vì xxxxxxxx.xx? 8 trong định nghĩa đề cập đến tổng số chữ số cả trước và sau dấu thập phân. –
Tóm lại, đó là lý do tương tự mà một phần ba không thể được biểu diễn chính xác theo số thập phân. Hãy xem bài viết cổ điển của David Goldberg "What Every Computer Scientist Should Know About Floating-Point Arithmetic" để biết chi tiết.
Để thêm làm rõ, một số dấu phẩy động được lưu trữ trong máy tính hoạt động như được mô tả bằng các bài đăng khác tại đây, vì như được mô tả, nó được lưu ở định dạng nhị phân. Điều này có nghĩa là trừ khi giá trị của nó (cả phần tử giá trị và số mũ của giá trị) là các lũy thừa của hai giá trị, và không thể được biểu diễn chính xác.
Một số hệ thống, mặt khác lưu các số thập phân theo số thập phân (kiểu số thập phân SQL, và kiểu dữ liệu số và kiểu dữ liệu số Oracle), và sau đó biểu diễn bên trong của chúng là chính xác cho bất kỳ số nào sức mạnh của 10. Nhưng sau đó con số đó không phải là quyền hạn của 10 không thể được đại diện chính xác.
- 1. Tốc độ tương đối của điểm trôi nổi so với điểm nổi nhân với
- 2. So sánh điểm nổi trong STL, BOOST
- 3. Đặc điểm so với giao diện so với Mixins?
- 4. x86 assembler: điểm nổi so sánh
- 5. vấn đề trong so sánh điểm nổi
- 6. Ưu điểm và nhược điểm của Điều tra so với Ống so với Ống là gì?
- 7. Giá GUID và so sánh đắt tiền như thế nào so với so sánh chuỗi
- 8. pymssql so với pyodbc so với adodbapi so với ...
- 9. So sánh điểm trôi nổi hiệu quả (Cortex-A8)
- 10. Ngày so với TimeStamp so với lịch?
- 11. APL so với A so với J so với K?
- 12. C++/CLI: Ưu điểm so với C#
- 13. Ưu điểm của Cache so với phiên
- 14. Mặt trước điều khiển so với mẫu mặt tiền
- 15. "-Weverything" năng suất "So sánh điểm nổi với == hoặc = là không an toàn!"
- 16. Các vấn đề so sánh điểm nổi MySQL
- 17. Application_Start so với OnInit so với constructor
- 18. metaphone so với soundex so với NYSIIS
- 19. Được tăng gấp đôi so với phao nổi trong C#?
- 20. Tên thực thể so với tên bảng
- 21. NSImage so với CIImage so với CGImage?
- 22. GetKeyState() so với GetAsyncKeyState() so với getch()?
- 23. zend-framework so với Kohana so với Symfony
- 24. Lây lan so với MPI so với zeromq?
- 25. Bảo mật của Tomcat so với WebSphere so với WebLogic
- 26. SLF4J ghi vào tệp so với DB so với Solr
- 27. pthread_cond_wait so với semaphore
- 28. Freemarker so với Velocity
- 29. cisc so với risc
- 30. nội tuyến so với __inline so với __inline__ so với __forceinline?
Điều này: http://www.panix.com/~arnow/brooklyn_college/diatribe.html – Moshe