下面是我的代码:
int oupt=0;
for(int i=0, power=number.length()-1; i<number.length(); i++, power--) {
oupt+=((int)number[i]-48)*pow(5, power);
}
string output = std::to_string(oupt);
在这个例子中,number是一个我想要从基数5转换为基数10的数字的字符串,例如“414”,当我运行代码时,我得到的答案是108,而我知道答案是109。 对于5的所有其他基,它给出的输出是递减一。 当我尝试打印((int)number[i]-48)*pow(5,power)时,我得到了有意义的输出,100,5,4。 加起来是109个。 我得到的输出是108。 从基数5到基数10的所有转换都是如此。 请帮帮我。
任何工具集如果没有为带有整数参数的pow
提供精确的double
值,都应该被认为是有缺陷的。
但是,C++标准允许pow
给出一个近似,超出了双精度浮点算术中常见的近似。 在某些标准(如IEEE754)下,要求某些函数(如sqrt
)和算术运算符返回尽可能最佳的浮点数,但该规则不适用于pow
。 它允许编译器和C++标准库供应商懒惰地将pow(x,y)
实现为exp(y*log(x))
。 这可能会低于正确的值,而截断为整型则会使问题变得非常严重。
这就是发生在你身上的事。
在pow
结果周围放置std::round
可能会起作用。
如果您必须滚动自己的文本到整数转换,则可以简单得多:
const int base = 5;
int oupt = 0;
for (int i = 0; i < number.length(); ++i) {
oupt *= base;
oupt += number[i] - '0'; // works for all character encodings
}
std::string output = std::to_string(oupt);
注意:不使用或不需要浮点数学。
但是使用标准库更容易:
int oupt = std::stoi(number, nullptr, base);