2013-11-15 2 views
0

я получаю эту ошибку:C# - Что случилось с моим преобразованием из double в int?

"Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?)"

Код:

Console.WriteLine("ISBN-Prüfziffer berechnen"); 
Console.WriteLine("========================="); 
Console.WriteLine(); 
Console.Write("ISBN-Nummer ohne Prüfziffer: "); 
string ISBNstring = Console.ReadLine(); 
int ISBN = Convert.ToInt32(ISBNstring); 
int PZ; 
int i; 
double x = Math.Pow(3, (i + 1) % 2); 
int y = (int)x; 
for (i = 1; i <= 12; i++) 
{ 
    PZ = ((10-(PZ + ISBN * x) % 10) % 10); 
} 
Console.WriteLine(PZ); 
Console.ReadLine(); 

Вот новый код:

Console.WriteLine("ISBN-Prüfziffer berechnen"); 
Console.WriteLine("========================="); 
Console.WriteLine(); 
Console.Write("ISBN-Nummer ohne Prüfziffer: "); 
string ISBNstring = Console.ReadLine(); 
long ISBN = Convert.ToInt32(ISBNstring); 
long ISBN1 = (Int64)ISBN; 
int PZ = 0; 
int i; 
for (i = 1; i <= 12; i++) 
{ 
    double x = Math.Pow(3, (i + 1) % 2); 
    long y = (double)x; 
    PZ = ((10 - (PZ + ISBN * y) % 10) % 10); 
} 
Console.WriteLine(PZ); 
Console.ReadLine(); 

Но я все еще получаю ошибку преобразования для двойной длиной и long to int ...

ответ

12

Я думаю, вы хотели использовать свой y переменных здесь вместо x:

PZ = ((10-(PZ + ISBN * y) % 10) % 10); 

В качестве примечания, вы получите ошибку компиляции на обоих PZ и i, вы должны инициализировать их значение перед их использованием, например, int PZ = 0; и int i = 0;

И, пожалуйста, используйте значащие имена; PZ, i, x и y ничего не значит, чтобы кто-то читал ваш код или даже вам через несколько недель.


Хорошо, я изменил его немного ...

Console.WriteLine("ISBN-Prüfziffer berechnen"); 
Console.WriteLine("========================="); 
Console.WriteLine(); 
Console.Write("ISBN-Nummer ohne Prüfziffer: "); 
string ISBNstring = Console.ReadLine(); 

int sum = 0; 
for (int i = 0; i < 12; i++) 
{ 
    int digit = ISBNstring[i] - '0'; 
    if (i % 2 == 1) 
    { 
     digit *= 3; 
    } 
    sum += digit; 
} 
int result = 10 - (sum%10); 

Console.WriteLine(result); 
Console.ReadLine(); 

Вот изменения:
- Вы можете объявить I непосредственно в цикл, это сэкономит вам линию ,
- Вместо того, чтобы помещать ISBN в длинный, держитесь в строке. Просто перебирайте каждого персонажа один за другим.
- каждую цифру можно получить, взяв значение ASCII и удалив значение 0.
- вещь % 2 == 1 в основном «Если номер находится в нечетном положении», где вы можете применить * 3. Это заменяет ваш Math.Pow, который был не очень ясен.

+0

Пятно на, удалено мой ответ –

+0

@ Брадофф, просто небольшое дополнение к ответу. Похоже, что вычисление x (и y соответственно) должно происходить внутри цикла, или? – elgonzo

+0

Спасибо! Ошибка исчезла. Но по какой-то причине код не работает, как я думал. – Bradolf

Смежные вопросы