Почему возвращает C # Convert.ToDouble (5/100) 0,0, а не 0,05 - PullRequest
8 голосов
/ 05 августа 2010
double variable = Convert.ToDouble(5/100);

Вернет 0,0, но я ожидал 0,05

Что я могу / должен изменить, чтобы получить 0,05

, потому что 5 в этом примере является переменной

Ответы [ 7 ]

19 голосов
/ 05 августа 2010

5/100 делается в целочисленной арифметике, которая дает 0 до преобразования.Попробуйте

double variable = 5.0/100;

Если 5 находится в переменной x (целочисленного типа), тогда используйте:

variable = (double)x/100; 

или

variable = ((double)x)/100;

чтобы прояснить намерение (спасибо Джон!)

или

variable = x/100.0;
4 голосов
/ 05 августа 2010

В отличие от реального мира, компьютеры воспринимают математические операции немного по-другому, хотя мы не понимаем, почему они ведут себя так.

1.) Почему они ведут себя какthis?

Обратите внимание, что целые числа являются целыми числами, а переменные типа integer могут хранить только целые числа и не могут хранить или распознавать десятичные числа.когда вы говорите 5/100, и 5, и 100 являются целочисленными литералами для компьютеров, и это называется целочисленное деление .Результат должен быть 0,05, но , так как это целочисленное деление, результатом также будет целое число , и, как я сказал, целые числа не могут хранить значения десятичной точки, конечная часть после "."(десятичная точка) полностью игнорируется и, следовательно, результат равен 0 .

Если добавить к этому больше, хотя вы конвертируете результат в удвоение, это не имеет никакого значения, потому что перед нимфактически конвертируется в удвоение, результат уже равен 0, и получается, что целое число 0 преобразуется в удвоение, что в итоге приводит к 0,0 .

2.) Как получить желаемый результат?*

Другие ответы очень хорошо объясняют решение, поэтому я прошу вас сослаться на эти ответы, а не заново изобретать колесо для вас.

Надеюсь, это поможет.

2 голосов
/ 05 августа 2010

5/100 - целочисленная арифметика. Чтобы иметь двойную точность, одно или несколько значений должны быть удвоены.

double result = 5.0/100.0;  
double result = 5.0/100;  
double result = 5/100.0;  
double result = (double)5/100;  
double result = 5/(double)100;

или

double numerator = 5;  
double denominator = 100;  
double result = numerator / denominator;
2 голосов
/ 05 августа 2010

Поскольку целочисленное деление 5/100 равно 0. Вы должны убедиться, что делите на двойные числа.

1 голос
/ 05 августа 2010

двойная переменная = 5D / 100D;

0 голосов
/ 05 августа 2010

так вот мой пересмотренный "взвешенный" ответ ...

так как мы не знаем, какой тип переменной прибывает в качестве числителя, нам пришлось бы использовать Double.TryParse для этого. В лаборатории мы могли бы приготовить что-то вроде этого:

var numerator = "5"; // let's make it string to prove the point
double parsedNumerator;
int denominator = 100; // this could well be a constant

double result;
if(Double.TryParse(numerator, out parsedNumerator))
{
    // notice no casting or convert fluff
    result = parsedNumerator/denominator;
    // do something with the result
}
else
{
    // warn that the numerator is doo-lallie
}

теперь прячусь под столом - на всякий случай я упустил что-то еще очевидное !! :)

джим

0 голосов
/ 05 августа 2010

Марко,

попробуйте вместо этого:

double variable = Convert.ToDouble((double)5/100);

jim

[позднее редактирование] - как было указано (молчаливыми избирателями:)) использование Convert является избыточным.Очевидно, это должно быть сделано аналогично другим записям.Я признаю это, но оставлю это выше в качестве примера того, как быстро понизиться при ответе на вопрос в спешке ... пусть осторожность будет вашим хозяином !!

Кроме того, поскольку мы не знаем,переменная будет исходить из строки или числа, он также должен учитывать трипарс и т. д. для числа 1, прежде чем выполнять арифметику.

...