2013-03-20 26 views
5

Tôi có một lỗi lạ khi tôi sử dụng Math.floor chức năng trên các giá trị gấp đôi tăng lên của 0,1 mỗi lần.LUA (Corona SDK) Math.floor() trả về giá trị sai với tăng 0,1

Nó chỉ xảy ra với một tăng là 0,1 và bắt đầu từ giá trị 5

dụ: Math.floor (4) trả nhưng Math.floor (5) trả !!!

Bạn có thể thử nó cho mình, với mảnh này mã đơn giản:

for i=3,7,0.1 do 
    print("val : "..i.." floor : "..math.floor(i)) 
end 

Dưới đây là kết quả của đoạn code trên:

Corona Simulator[1494:707] val : 3 floor : 3 
Corona Simulator[1494:707] val : 3.1 floor : 3 
Corona Simulator[1494:707] val : 3.2 floor : 3 
Corona Simulator[1494:707] val : 3.3 floor : 3 
Corona Simulator[1494:707] val : 3.4 floor : 3 
Corona Simulator[1494:707] val : 3.5 floor : 3 
Corona Simulator[1494:707] val : 3.6 floor : 3 
Corona Simulator[1494:707] val : 3.7 floor : 3 
Corona Simulator[1494:707] val : 3.8 floor : 3 
Corona Simulator[1494:707] val : 3.9 floor : 3 
Corona Simulator[1494:707] val : 4 floor : 4 
Corona Simulator[1494:707] val : 4.1 floor : 4 
Corona Simulator[1494:707] val : 4.2 floor : 4 
Corona Simulator[1494:707] val : 4.3 floor : 4 
Corona Simulator[1494:707] val : 4.4 floor : 4 
Corona Simulator[1494:707] val : 4.5 floor : 4 
Corona Simulator[1494:707] val : 4.6 floor : 4 
Corona Simulator[1494:707] val : 4.7 floor : 4 
Corona Simulator[1494:707] val : 4.8 floor : 4 
Corona Simulator[1494:707] val : 4.9 floor : 4 
Corona Simulator[1494:707] val : 5 floor : 4 
Corona Simulator[1494:707] val : 5.1 floor : 5 
Corona Simulator[1494:707] val : 5.2 floor : 5 
Corona Simulator[1494:707] val : 5.3 floor : 5 
Corona Simulator[1494:707] val : 5.4 floor : 5 
Corona Simulator[1494:707] val : 5.5 floor : 5 
Corona Simulator[1494:707] val : 5.6 floor : 5 
Corona Simulator[1494:707] val : 5.7 floor : 5 
Corona Simulator[1494:707] val : 5.8 floor : 5 
Corona Simulator[1494:707] val : 5.9 floor : 5 
Corona Simulator[1494:707] val : 6 floor : 5 
Corona Simulator[1494:707] val : 6.1 floor : 6 
Corona Simulator[1494:707] val : 6.2 floor : 6 
Corona Simulator[1494:707] val : 6.3 floor : 6 
Corona Simulator[1494:707] val : 6.4 floor : 6 
Corona Simulator[1494:707] val : 6.5 floor : 6 
Corona Simulator[1494:707] val : 6.6 floor : 6 
Corona Simulator[1494:707] val : 6.7 floor : 6 
Corona Simulator[1494:707] val : 6.8 floor : 6 
Corona Simulator[1494:707] val : 6.9 floor : 6 
Corona Simulator[1494:707] val : 7 floor : 6 

Nếu nó có thể giúp đỡ, nếu chúng ta áp dụng một modulo 1 về kết quả của giá trị lỗi, chúng tôi nhận được kết quả là: 0.99999999999999

+0

thể trùng lặp của [? Tại sao Lua số học không bằng bản thân] (http://stackoverflow.com/câu hỏi/6366954/tại sao-là-lua-số học-là-không-bằng-chính nó) – finnw

Trả lời

4

thực sự đó là một vấn đề phao thông thường,

Đây là phản ứng chính thức tôi đã nhận được từ sự ủng hộ corona:

Xin chào,

gì bạn đang nhìn thấy là một vị tướng vấn đề với số dấu chấm động. Tất cả các số trong Lua là các số dấu phẩy động và vì vậy có thể là để làm tròn lỗi. Thêm 0,1 vào một số dấu phẩy động khác không phải là chính xác 0,1 và lỗi tích lũy khi được sử dụng hết lần này đến lần khác. Khi bạn nghĩ con số này là 5.0, nó có thể là 4.99999999999999999, do đó, lợi nhuận sàn 4. Bản in có thể được làm tròn trước khi in .

Thư viện toán là mã Lua chuẩn (v5.1) và chưa được sửa đổi cho Corona.

Bạn có thể google chủ đề hoặc các vấn đề làm tròn dấu phẩy động, nhưng trong chung, bạn cần phải cẩn thận khi sử dụng toán học dấu phẩy động.

Kính trọng, Tom

- Corona Labs - Hỗ trợ [email protected]

4

F số điểm lo ngại là ma quỷ. Không sử dụng chúng như các bộ đếm vòng lặp.

for i = 30, 70 do 
    local i = i/10 
    print("val : "..i.." floor : "..math.floor(i)) 
end 
+0

Cảm ơn, nó hoạt động theo cách này, nhưng điều này là tôi không sử dụng một vòng lặp for trong dự án thực sự của tôi. Tôi sử dụng một bổ sung đơn giản (để cập nhật vị trí ký tự). Tôi đã cố gắng thay thế mỗi phao trong mã của tôi bằng các giá trị được tính toán (như 1/10) và nó vẫn không hoạt động: ( – chip

+0

@ user1029976 - Bạn có thể sử dụng làm tròn đến n/10 gần nhất: 'x = math.floor (x * 10 + 0.5)/10' –

+0

@ user1029976 vấn đề cơ bản là 0,1 (hoặc 1/10) không phải là số nhị phân hữu hạn (đó là '0,0001100110011 ...'). Biểu diễn dấu phẩy động có giới hạn ở một số điểm, đó là lý do tại sao bạn nhận được lỗi làm tròn tại một số điểm. Thay vào đó, tăng vị trí ký tự của bạn lên 1 và chỉ chia cho 10 khi bạn thực sự sử dụng giá trị. –