从文本文件C++读入时,数字的奇怪四舍五入
Strange rounding of numbers when reading in from text file C++
我有一个仅包含以下行的文本行。
0.01180994648909809 0.0118339243907452 0.01153905217670122
0.0376759911531237 0.03771224865527065 0.03765957194275842
我使用以下代码读取该数据并将其输出到终端
using namespace std;
int main(int argc, char *argv[])
{
ifstream infile(argv[1]);
string line;
double a,b,c;
while(getline(infile,line))
{
istringstream iss(line);
iss >> a >> b >> c;
cout<<a<<"t"<< b << "t"<<c<<endl;
}
return 0;}
我得到的输出是
0.0118099 0.0118339 0.0115391
0.037676 0.0377122 0.0376596
为什么在输出中数字被四舍五入到小数点后的7位?仅在显示到标准输出时执行此舍入吗?
EDIT:将建议的解决方案移至相关信息的顶部。
可以使用set::precision查看正确的精度
除了上面的答案,重要的是要注意,无论何时,您使用浮点数和十进制数舍入误差 &精度是一个确定的因素。
什么是精度错误?
浮点数的精度是指它能表示多少位而不丢失它所包含的任何信息。
考虑分数1/3
。这个数的十进制表示是0.33333333333333…
加上3直到无穷。无限长度的数字需要无限的内存才能精确地描述,但是float
或double
数据类型通常只有4
或8
字节。因此,浮点&双位数只能存储一定数量的数字,其余的数字必然会丢失。因此,没有明确准确的方法来表示浮点数或双精度数,这些数字要求的精度超过变量所能容纳的精度。
什么是舍入误差?
binary
与decimal (base 10)
的数值差异不明显。
考虑分数1/10
。在decimal
中,这可以很容易地表示为0.1
,而0.1
可以被认为是一个容易表示的数字。然而,在二进制中,0.1
用无穷数列表示:0.00011001100110011…
一个例子:
#include <iomanip>
int main()
{
using namespace std;
cout << setprecision(17);
double dValue = 0.1;
cout << dValue << endl;
}
输出如下:
0.10000000000000001
和
0.1.
这是因为由于内存有限,双精度体必须截断近似值,这导致数字不完全是0.1
。这种情况称为舍入误差。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何用数字处理log(0)
- 使用 BMI 计算器对C++中的数字进行四舍五入的问题
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 找到printf的意外错误,该格式为0.1F,用于四舍五入数字
- 避免双精度数字的四舍五入
- 有没有办法将数字作为字符串,并在不使用浮点数或双精度数的情况下将其四舍五入到确切的位数
- 由于四舍五入,计算 1 到 100 之间的数字的程序永远不会猜"100"
- 为什么(long)总是把数字四舍五入
- 四舍五入浮点数:精确地输出小数点后的两位数字
- 将双精度数字四舍五入到十分之一位
- 从文本文件C++读入时,数字的奇怪四舍五入
- 我需要知道如何在c++中将数字四舍五入到小数点后的某个位置
- 将非常小的数字四舍五入为零(c++)
- 小数字四舍五入为零
- 像 0.999999 这样的数字四舍五入为 1