Почему следующее присвоение переменной не работает правильно? - PullRequest
1 голос
/ 26 октября 2019

Я попытался преобразовать пользовательский ввод из строки в int, приведя каждый символ к int и умножив его на соответствующую экспоненту. Все работает правильно, пока мне не нужно присвоить значение результата переменной int. Это всегда на единицу меньше правильного значения, когда назначенное значение находится между 100 и 1000. т. Е. int k=0; k+=100; Но печать k показывает 99. Но k+=1000 работает нормально.

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

string k_input;
cin >> k_input;
int k = 0;
for (int i = 0; i < k_input.length(); i++)
{
    cout << (k_input[i] - '0') << " " << pow(10, (k_input.length() - i) - 1) << endl;

    k += (k_input[i] - '0') * pow(10, k_input.length() - i - 1);
}

т.е. при вводе 123 вывод должен быть 123, но вместо этого он показывает 122.

И ввод 1221 показывает1221 как ожидалось.

1 Ответ

1 голос
/ 26 октября 2019

Проблема, которая вполне может быть связана с компилятором и / или платформой, почти наверняка связана с ошибками «округления» при преобразовании вывода double вашего вычисления в значение int. Вы можете исправить это с помощью функции lround (определенной в <cmath>):

k += lround((k_input[i] - '0') * pow(10, k_input.length() - i - 1));

Кстати, при включении предупреждений компилятора будут выделены такие проблемы! Для вашего кода в Visual Studio мне было показано:

warning C4244: '+=': conversion from 'double' to 'int', possible loss of data
...