Như đã nói trong các câu trả lời khác, Float không chính xác. Ngoài ra hãy nhớ rằng Visualworks Float mặc định với độ chính xác đơn (khoảng 7 chữ số thập phân), nếu bạn đặt số float của bạn bằng chữ d, như 5.1d bạn sẽ nhận được độ chính xác gấp đôi (khoảng 15 chữ số thập phân), ít chính xác hơn, nhưng vẫn không chính xác.
Một nguồn gây nhầm lẫn bổ sung là hai Float khác nhau có thể in với cùng biểu diễn thập phân tương tự trong Visualworks.
5.1 squared printString
-> '26.01'
nhưng
5.1 squared = 26.01
-> false
Lưu ý rằng Squeak gần đây hoặc in Pharo vừa đủ số thập phân để phân biệt nổi khác nhau (và diễn giải chúng không thay đổi)
5.1 squared
->26.009999999999998
Ngoài ra, bạn có thể sử dụng cái gọi là FixedPoint (trong VisualWorks hoặc ScaledDecimals trong các hương vị khác) để thực hiện các hoạt động chính xác:
theTestArray := #(1.2s 3 5.1s 7).
self assert: theTestArray squareOfAllElements = #(1.44s 9 26.01s 49).
Cũng hãy cẩn thận với cái bẫy khác này: một FixedPoint (ScaledDecimals) chỉ in được nhiều số thập phân sau điểm thập phân như đã nói, nhưng bên trong nó có thể chứa nhiều (vô hạn nhiều).
5.1s1 squared printString
-> '26.0s1'
nhưng
5.1s1 squared = 26.01s2
-> true
Nguồn
2012-07-17 21:50:49