我需要从文本文件中读取一些数据(以double
精度)。但有时,使用atof
将string
转换为double
会得到奇怪的结果。以下是一个代码片段,它演示了这个问题-请注意,我使用的是GNU C++ 4.8.1编译器。该代码简单地打印出介于-0.1和0之间、步长为0.01的数字;因此只期望得到9个数字。
#include <iostream>
#include <cstdlib>
int main() {
int y;
double a, b = 0.0, x = 1e-2, z;
double a_string = atof("-0.1");
double a_inline = -0.1;
std::cout << "Inline:: ";
a = a_inline;
for (y = 1 ; (z = a + y * x) < b; ++y){
std::cout << y << ": " << z << " | ";
}
std::cout << "\nString:: ";
a = a_string;
for (y = 1 ; (z = a + y * x) < b; ++y){
std::cout << y << ": " << z << " | ";
}
return 0;
}
结果是
Inline:: 1: -0.09 | 2: -0.08 | 3: -0.07 | 4: -0.06 | 5: -0.05 | 6: -0.04 | 7: -0.03 | 8: -0.02 | 9: -0.01 |
String:: 1: -0.09 | 2: -0.08 | 3: -0.07 | 4: -0.06 | 5: -0.05 | 6: -0.04 | 7: -0.03 | 8: -0.02 | 9: -0.01 | 10: -3.46945e-18 |
请注意,基于字符串赋值(a_string)的for循环比基于内联赋值(a_inline)的循环运行多一次 - 注意最后一个数字-3.46945e-18。尽管我已经阅读了其他相关帖子关于字符串转double的内容,但仍然无法弄清楚为什么会出现这种情况。