我正在用C ++编写一个函数来将一个数字从一些基数转换为十进制数。 当位数是偶数时它工作正常,但是当它是奇数时它会给出错误的答案。
例如:
Number to convert : 100
Base to convert to: 10
Correct answer : 100
Function's output : 99
以下是代码:
unsigned long long convertToDecimal(const std::string& number, const unsigned base)
{
std::string characters = "0123456789abcdef";
unsigned long long res = 0;
for(int i = 0, len = number.size(); i<len; ++i)
{
res += characters.find(number.at(i))*std::pow(base, len-1-i);
}
return res;
}
我正在使用g ++ C ++ 11。
答案 0 :(得分:4)
我无法重现您的特定问题,但std::pow
会返回一个浮点数,您的实现可能会引入某种舍入错误,转换为unsigned long long
时会导致错误的结果。< / p>
为避免这些错误,在处理整数时,您应该考虑避免std::pow
。例如,您的函数可能是这样编写的:
#include <iostream>
#include <string>
#include <cmath>
unsigned long long convertToDecimal(const std::string& number, const unsigned base)
{
std::string characters = "0123456789abcdef";
unsigned long long res = 0;
unsigned long long power = 1;
for(auto i = number.crbegin(); i != number.crend(); ++i)
{
// As in your code, I'm not checking for erroneous input
res += characters.find(*i) * power;
power *= base;
}
return res;
}
int main ()
{
std::cout << convertToDecimal("100", 2) << '\n'; // --> 4
std::cout << convertToDecimal("1234", 8) << '\n'; // --> 668
std::cout << convertToDecimal("99999", 10) << '\n'; // --> 99999
std::cout << convertToDecimal("fedcba", 16) << '\n'; // --> 16702650
}