2012-06-20 50 views

Trả lời

21

Bất kỳ trợ giúp nào sau đây?

println(3.0/4.0) 
println(3.toDouble/4.toDouble) 
41

Nếu bạn đang gõ số, chỉ cần gõ ít nhất một trong số họ như một phao (tôi giả sử bạn có nghĩa là Float không Double):

println(3f/4) 

Nếu bạn đã có những con số trong các biến , chuyển đổi ít nhất một trong số họ với toFloat

val x = 3 
println(x.toFloat/4) 

(trong mỗi trường hợp, nếu bạn có ít nhất một, trình biên dịch sẽ chuyển đổi khác để Float để khớp.)

+3

Bạn có thể muốn sử dụng gấp đôi, thay vì phao. –

6

Đối với các kiểu nguyên thủy (Int, Float, Double etc), Scala tuân thủ các quy tắc trong Java.

Nếu bạn viết số nguyên nguyên 3, 4, v.v., biểu thức của chúng sẽ vẫn là số nguyên. Vì vậy,

println(3/4) 

có biểu hiện bao gồm hai số nguyên nên kết quả là một số nguyên: 0.

Nếu bất kỳ giá trị sẽ xảy ra là một phao thay vì một Int, toàn bộ biểu hiện mở rộng để trở thành một Phao. Điều này cũng đúng cho một đôi. Việc mở rộng này xảy ra gần như hoàn toàn tự động - bạn chỉ cần cung cấp cho trình biên dịch gợi ý về những gì bạn muốn, ví dụ:

println(3f/4) 

mở rộng để Float và

println(3.0/4) 

mở rộng để đôi.

Khi sử dụng các tính năng ngôn ngữ này trong các chương trình thực tế, hãy luôn nghĩ về sự mất chính xác có thể xảy ra. Bạn đã nhận thấy sự phân chia số nguyên gây ra sự mất mát của phần thập phân trong trường hợp đó. Nhưng có một trường hợp khác nhau cho dấu chấm động mà được minh họa ở đây:

println(4f/3) 

Kết quả thực tế được tổ chức tại một đại diện nhị phân (sử dụng tiêu chuẩn IEEE754) trong đó có phân số nhị phân, phân số không số thập phân, và do đó không thể giữ 4f/3 không có lỗi nhỏ.

scala> println(100f/99f * 99) 
99.99999 

Bạn có thể đã mong đợi nó in 100. Đôi khi điều này không quan trọng và đôi khi điều đó xảy ra. Một trường hợp rất phổ biến mà nó quan trọng rất nhiều là khi giao dịch với các giá trị tiền tệ. Quy tắc của ngón tay cái là ALWAYS AVOID float và double for money: sử dụng BigDecimal thay vào đó, hoặc chỉ giữ số lượng pence là Long có lẽ, hoặc đôi khi dùng đến Strings (chơi tốt với BigDecimal miễn là chúng không được phân tích cú pháp thành Double value trên đường).

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