2012-05-16 39 views
10

Tôi cần so sánh hai giá trị. Một giá trị là price đại diện cho giá hiện tại của một cái gì đó và vì vậy decimal bởi vì bạn thực sự có thể mua hoặc bán thứ gì đó theo mức giá này.để so sánh gấp đôi và số thập phân tôi có nên truyền gấp đôi sang thập phân hay thập phân để tăng gấp đôi không?

giá trị khác là estimatedPrice mà là kết quả của các phép tính toán học và do đó double vì nó chỉ là estimation và bạn có thể không thực sự làm bất cứ "hoạt động" của thành viên này esitmatedPrice

bây giờ tôi muốn mua nếu price < estimatedPrice.

Vì vậy, tôi có nên truyền giá thành gấp đôi hoặc ước tínhGiá trị thập phân?

Tôi hiểu rằng sau khi truyền tôi sẽ nhận được các số "hơi khác", nhưng có vẻ như tôi không có các tùy chọn khác.

+0

@BlueChippy bạn không thể sử dụng nổi cho dữ liệu giá nếu các mặt hàng đắt tiền. Ví dụ, float không thể đại diện cho '123456.78'. – phoog

+0

Thập phân chiếm nhiều bộ nhớ hơn và có số lượng lớn hơn với phạm vi nhỏ hơn và do đó có thể "chính xác hơn" (tùy thuộc vào quan điểm của bạn về "chính xác") so với các điểm nổi (float/double). Bạn có thể vui vẻ sử dụng gấp đôi cho cả hai giá trị, hoặc thập phân, hoặc phao nếu bạn muốn, đặc biệt nếu Giá luôn ở hai chữ số thập phân. Bạn không thể chuyển đổi rõ ràng từ bất kỳ dấu phẩy động nào thành số thập phân (vì chúng hoàn toàn khác nhau), vì vậy có thể tốt nhất trong trường hợp này để chọn một cho tất cả các loại. Sẽ để nó cho người khác đề nghị cái nào! (Tôi muốn đi thập phân, cá nhân) – BlueChippy

+0

@phoog Đúng, phụ thuộc vào kịch bản. Pref cá nhân của tôi là một trong hai thập phân (ưa thích) hoặc gấp đôi ... nhưng sử dụng loại đó trên bảng nếu có thể. – BlueChippy

Trả lời

11

Tùy thuộc vào dữ liệu. Thập phân có độ chính xác cao hơn; đôi có phạm vi rộng hơn. Nếu giá trị kép có thể nằm ngoài phạm vi thập phân, bạn nên bỏ số thập phân sang gấp đôi (hoặc thực sự bạn có thể viết phương thức trả về kết quả mà không cần truyền, nếu giá trị kép nằm ngoài phạm vi thập phân; xem ví dụ bên dưới).

Trong trường hợp này, có vẻ như không có giá trị kép nằm ngoài phạm vi thập phân, vì vậy (đặc biệt vì bạn đang làm việc với dữ liệu giá), bạn nên truyền số thập phân sang số thập phân.

Ví dụ (có thể sử dụng một số logic để xử lý các giá trị NaN):

private static int Compare(double d, decimal m) 
{ 
    const double decimalMin = (double)decimal.MinValue; 
    const double decimalMax = (double)decimal.MaxValue; 
    if (d < decimalMin) return -1; 
    if (d > decimalMax) return 1; 
    return ((decimal)d).CompareTo(m); 
} 
0

Tôi chưa bao giờ làm việc với giá cả trước đây về phần mềm, nhưng từ những gì tôi đã nghe, nhiều giao dịch với số nguyên. Ví dụ, đối với $ 1,23, lưu trữ nó như là số nguyên 123. Việc chuyển đổi sang một số thập phân được thực hiện ở cuối cùng khi bạn xuất kết quả cho người dùng.

Tương tự, với giá ước tính, bạn có thể xử lý các con số lớn hơn 100 lần không?

+0

điều này có thể là một tối ưu hóa tốt, tuy nhiên ngay bây giờ tôi nên hoặc là hai lần để thập phân hoặc thập phân để tăng gấp đôi. Ngoài ra tôi đoán có lẽ 'thập phân' bên trong sử dụng' int' vì vậy nó sẽ được dễ dàng hơn để chỉ cần sử dụng 'thập phân' cho giá cả. – javapowered

1

tôi khuyên bạn nên chuyển sang thập phân. bởi vì có vẻ như bạn muốn thao túng các giá trị tiền. nhưng tôi có thể đưa ra câu trả lời ngắn gọn này: đối với số thập phân chính xác (sử dụng các giá trị tiền đặc biệt cho các ứng dụng tài chính). và nếu bạn thích ít tài nguyên hơn và sử dụng tốc độ gấp đôi.

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