2010-04-08 42 views
22

Vui lòng tha thứ cho kiến ​​thức lập trình của tôi. Tôi biết đây là một điều đơn giản, nhưng tôi không hiểu tại sao kết quả luôn là 0. Tại sao số thập phân sẽ ổn?Tại sao tôi không thể nhận phần trăm bằng cách sử dụng Int

int a = 100; 
int b = 200; 
decimal c = (a/b) * 100; 

Rất cám ơn.

+3

c = (a * 100)/b; – kenny

+3

Điều đó sẽ không hoạt động. a * 100/b vẫn cắt ngắn số thập phân và sau đó chuyển thành kiểu thập phân. Bạn sẽ không có mantissa. – Armstrongest

+1

c = (a * 100M)/b; Ngoài ra, hãy xem http://mathworld.wolfram.com/IntegerDivision.html – Greg

Trả lời

54

Phân tách số nguyên luôn cắt bớt phần còn lại. Điều này được thực hiện tại thời điểm số được chia, không phải khi số được gán cho biến (như tôi đoán bạn đã giả định).

decimal c = ((decimal)a/b) * 100; 
+0

Cắt ngắn còn được gọi là hoạt động Tầng toán học. –

+0

+1 cho thay đổi tối thiểu để sửa câu trả lời. –

+4

@ rlb.usa: Cho dù đó là một tầng thích hợp phụ thuộc vào cách nó xử lý âm bản. Off-hand, tôi tin rằng nó thay đổi -1,2-1, không -2, mặc dù. –

13

Giá trị a/b sẽ trả về 0 luôn vì chúng là số nguyên. Vì vậy, khi các giá trị trong dấu ngoặc được đánh giá về mặt kỹ thuật bạn đang làm

decimal c = (0) * 100 

làm tốt hơn này,

decimal c = ((decimal)a/(decimal)b) * 100 
+0

-1 để có câu trả lời khó hiểu và gây nhầm lẫn. 'int/int = int', có vẻ như bạn biết nhưng không giải thích được. – ANeves

+2

"a/b sẽ trả về 0 luôn" trừ khi các giá trị khác nhau được đưa ra cho 'a' và' b', trong trường hợp đó nó sẽ là 'a/b'. –

9

100/200 là 1/2 hoặc 0,5. Vì bạn đang sử dụng ints, nó làm tròn xuống 0 (không). Và 0 * 100 vẫn là 0. Các phần bên trong ngoặc luôn được đánh giá đầu tiên: nếu bạn muốn làm việc này, sử dụng:

decimal c = (a * 100)/b; 

Edit: nếu bạn muốn có một giá trị chính xác hơn chứ không phải là một "tỷ lệ phần trăm số nguyên "(ví dụ: 33.333% thay vì 33%), bạn nên sử dụng câu trả lời của Bragaadeesh.

+0

Như tôi đã nói với Stu Mackellar, điều này không hoàn toàn hiệu quả vì nó cắt ngắn. –

+2

Nếu bạn viết lại đó là '(a * 100M)/b', bạn sẽ nhận được kết quả mong muốn. –

+0

@Steven, như tôi đã nói với bạn trong câu trả lời của mình, đó có thể là những gì Daoming muốn. Đó là cách tôi giải thích yêu cầu của anh ta, vì anh ta bắt đầu với ints và muốn một tỷ lệ phần trăm. @Anthony tương tự như vậy, tôi * muốn * một câu trả lời số nguyên. – tloflin

0

Hãy chắc nó decimal c = (a * 100)/b;

+0

Tôi không nghĩ rằng điều này sẽ làm việc như bạn tưởng tượng. Nó sẽ làm tròn xuống. Ví dụ: nếu a = 1 và b = 3, chúng tôi muốn c là 33.333 (tối đa là 3 dấu của chúng tôi có thể giữ). Với mã của bạn, chúng tôi sẽ có 33.0 –

+0

Đúng. OP không đề cập đến việc anh ta muốn một số thực, nhưng tôi đoán nó được ngụ ý bằng số thập phân. –

+4

Nếu bạn viết lại đó là '(a * 100M)/b', bạn sẽ nhận được kết quả mong muốn. –

2

Integer toán đang được thực hiện, và kết quả là sau đó được lưu trữ dưới dạng số thập phân. 100/200 trong toán số nguyên là 0. Để nhận được phần trăm của bạn, hãy đặt ít nhất một giá trị thập phân trước khi thực hiện phép tính.

decimal c = (a/(decimal)b) * 100; 
0

int chỉ có thể là số nguyên, vì vậy 100/200 sẽ là 0. 0 * 100 vẫn là 0. Thay đổi kiểu đến một chữ số thập phân, và nó sẽ làm việc

1

Các toán được thực hiện vẫn là số nguyên toán.

(a/b) (100/200 hoặc 1/2) được thực hiện trên hai số nguyên, do đó kết quả bằng không. Zero * 100 là ... tốt, vẫn bằng không.

Sự cố bạn đang gặp phải là theo thứ tự các phép toán (a và b là số nguyên, do đó toán số nguyên được thực hiện).

Tôi đề nghị này:

decimal c=((decimal)a)/((decimal)b)*100;

Điều này sẽ buộc các toán thực hiện để các giá trị thập phân mà bạn tìm kiếm.

+0

Sử dụng 100.0M thay vì 100 để tránh chi phí cho việc truyền ngầm. –

+0

Nhưng sau đó hãy chắc chắn rằng bạn sử dụng 100.0M trên op đầu tiên. (Xem các câu trả lời khác để làm rõ.) – ANeves

0

Trong khi sử dụng số nguyên, '/' này là viết tắt của DIV và '%' này cho MOD. DIV là thương của phân chia, MOD là phần còn lại. Vì vậy, 100/200 = 0 và 100% 200 = 100.

Vì vậy, bạn cần phải thay đổi ab loại thành decimal, trong trường hợp của bạn.

1

Trong các ngôn ngữ được nhập mạnh, kết quả của phép toán thường là loại tương tự như loại lớn hơn.

C# có danh sách implicit numeric conversions nó sẽ thực hiện.

Việc tổng hợp danh sách này: Các loại tích phân có thể được chuyển đổi thành loại dấu phẩy động, nhưng không phải ngược lại. Các loại tích phân cũng có thể được chuyển đổi hoàn toàn thành decimal, nhưng các loại điểm động không thể.

Lưu ý: Điều này cũng có nghĩa là truyền một trong các int sang loại khác sẽ dẫn đến toàn bộ câu trả lời là loại đó. ví dụ: (decimal) a/b * 100.0 = 50.0

tl; dr:

Trong C#:

int/int = int 
int + decimal = decimal 
decimal + int = decimal 
int/int * decimal = (int/int = int) * decimal = decimal 
int - float = float 
int * double = double 
float/decimal = an error 
int - uint = an error (either that or ulong) 
+0

'100/200 * 100.0' vẫn sẽ là 0 mặc dù nó mang lại kết quả thập phân - hãy nhớ nó. – ANeves

+0

@sr pt: Ví dụ thứ tư xuống địa chỉ đó. Cụ thể, với các số được thay thế: '100/200 * 100.0 = (100/200 = 0) * 100.0 = 0.0' – Powerlord

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