2010-04-07 36 views
9

Bất kỳ cách thông minh để chuyển đổi một phao như thế này:C# phao để chuyển đổi số thập phân

float f = 711989.98f; 

vào một số thập phân (hoặc kép) mà không làm mất độ chính xác?

Tôi đã thử:

decimal d = (decimal)f; 
decimal d1 = (decimal)(Math.Round(f,2)); 
decimal d2 = Convert.ToDecimal(f); 
+0

Thông tin chi tiết: Tôi đang giao tiếp với một dịch vụ web cũ gửi đối tượng khổng lồ này có một số trường nổi. Khi tôi chuyển đổi sang kaboom thập phân ... không còn đồng xu nữa! – Adrian4B

+0

nếu điều này là đến từ một dịch vụ web trên dây nó có lẽ là XML, có nghĩa là không có phao hoặc số thập phân - chỉ là chuỗi. Hãy xem những chuỗi này được chuyển thành định dạng "nội bộ" – mfeingold

Trả lời

11

Quá muộn, chữ số thứ 8 bị mất trong trình biên dịch. Loại phao chỉ có thể lưu trữ 7 chữ số có nghĩa. Bạn sẽ phải viết lại mã, gán cho đôi hoặc thập phân tất nhiên sẽ giải quyết vấn đề.

+0

cảm ơn Tôi đã thay đổi loại trường trên đối tượng được ánh xạ từ phao sang thập phân và giải quyết vấn đề chuyển đổi đang diễn ra trong quá trình deserialization. – Adrian4B

1

Bạn đã thử?

decimal.TryParse() 

http://forums.asp.net/t/1161880.aspx

Không có chuyển đổi ngầm giữa phao/đôi và số thập phân. Chuyển đổi số ngầm định luôn được đảm bảo không bị mất độ chính xác hoặc độ lớn và sẽ không gây ra ngoại lệ.

+1

Chuyển đổi ngầm định không được đảm bảo là không bị mất chính xác. Việc chuyển đổi '9007199791611905' thành' double' sẽ mang lại '9007199791611904'. Chuyển đổi trực tiếp sang 'float' sẽ sinh ra' 9007200328482816'. Chuyển đổi thành 'double' và sau đó thành' float' sẽ sinh ra '9007199254740992' (bị giảm nhiều hơn nếu số được chuyển trực tiếp thành' float'). Hơn nữa, trong khi trình biên dịch cho phép chuyển đổi ngầm từ 'float' sang' double', các chuyển đổi như vậy có nhiều khả năng sai hơn sẽ là các chuyển đổi từ 'double' thành' float' mà không được phép nhưng nên được. – supercat

+1

@supercat rõ ràng [bạn có thể chuyển đổi một cách mất mát 'float' thành' double'] (http://stackoverflow.com/q/40550861/24874). Tuy nhiên việc chuyển đổi 'double' thành' float' có thể sẽ xuất hiện lỗi, tùy thuộc vào giá trị 'double' cụ thể đang được đề cập. –

+0

@DrewNoakes: Nếu người ta đã sử dụng tính toán lặp lại để tính toán vị trí của đối tượng bằng cách sử dụng kiểu 'double', và sau đó muốn vẽ nó bằng cách sử dụng thường trình đồ họa chấp nhận' float', chuyển đổi thành 'float' sẽ lop off độ chính xác vô ích ngay cả khi được giữ lại; lopping off độ chính xác gần như chắc chắn sẽ phù hợp với ý định lập trình viên. Ngược lại, nếu một số mã, ví dụ:chia 'int' hoặc' long' bằng 'float' và lưu kết quả bằng' double', sau đó trừ khi lập trình viên rõ ràng bỏ kết quả của phép chia thành 'float', tôi sẽ không cho rằng lập trình viên ... – supercat

1

Bạn đã mất chính xác thời điểm bạn đã viết 711989.98f.

711989.98 là số thập phân. Với f cuối cùng bạn đang yêu cầu trình biên dịch chuyển đổi nó thành float. Chuyển đổi này không thể được thực hiện mà không làm mất độ chính xác.

Điều bạn có thể muốn là thập phân d = 711989.98m. Điều này sẽ không mất đi độ chính xác.

+0

Ví dụ của bạn chỉ sử dụng một đôi, phải không? Nó vẫn có thể mất độ chính xác cho một số khác. Chỉ cần đặt 'm' ở cuối và làm cho chữ số thập phân bắt đầu bằng. –

1

Đây có thể là lỗi trình biên dịch vì có vẻ như một phao hợp lệ sẽ chuyển đổi trực tiếp thành số thập phân. nhưng nó sẽ không mất đi độ phân giải. Chuyển đổi 125.609375 từ phao sang thập phân sẽ mất độ phân giải. Tuy nhiên, chuyển đổi nó từ phao sang đôi và sau đó tăng gấp đôi thành thập phân sẽ giữ độ phân giải.

float float_val = 125.609375f; 

    decimal bad_decimal_val = (decimal)float_val; //125.6094 

    double double_val = (double)float_val; 
    decimal good_decimal_val = (decimal)double_val; 
Các vấn đề liên quan