Можлива втрата дробу


119

Пробачте, якщо це наївне запитання, проте я сьогодні втрачаю.

У мене простий розрахунок поділу, такий:

double returnValue = (myObject.Value / 10);

Значення - це int в об'єкті.

Я отримую повідомлення про можливу втрату дробу. Однак, коли я змінюю подвійний на int, повідомлення відходить.

Будь-які думки про те, чому це станеться?


Дякую всім за чудові відгуки. Тепер має сенс, що ви втрачаєте десяткову точку, розділяючи значення 2 int.
CodeLikeBeaker

Відповіді:


168

Якщо розділити два int на значення з плаваючою комою, частка дробу втрачається. Якщо ви передасте один з елементів на поплавок, ви не отримаєте цієї помилки.

Так, наприклад, перетворіть 10 на 10.0

double returnValue = (myObject.Value / 10.0);

57

Ви робите ціле ділення, якщо myObject.Valueце int, оскільки обидві сторони /є цілим числом.

Для поділу з плаваючою комою одне з чисел у виразі має бути типу з плаваючою комою. Це було б правдою, якби myObject.Value був подвійним або будь-яким із наступного:

double returnValue = myObject.Value / 10.0;
double returnValue = myObject.Value / 10d; //"d" is the double suffix
double returnValue = (double)myObject.Value / 10;
double returnValue = myObject.Value / (double)10;

7

Ціле число, поділене на ціле число, поверне ваше ціле число. Закиньте або значення в подвійне або поділіть на 10,0.


7

Якщо припустити, що myObject.Valueце intрівняння, рівняння myObject.Value / 10буде цілим діленням, яке потім буде переведено в подвійне.

Це означає, що myObject.Value, що має 12, призведе до того, що returnValue стане 1, а не 1,2.

Спершу потрібно надати значення (и):

double returnValue = (double)(myObject.Value) / 10.0;

Це призведе до правильного значення 1,2, принаймні настільки ж правильного, як парні дозволять враховувати свої обмеження, але це обговорюється в інших місцях на SO, майже нескінченно :-)


4

Я думаю, оскільки myObject - це int, ти повинен

double returnValue=(myObject.Value/10.0); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.