为什么cout会删除浮点数的尾随零

时间:2015-06-19 14:40:37

标签: c++

所以我有这段代码

template <typename T, typename T2>
void print (const T& a, const T2& b)
{
cout << a<<endl<<b<<endl ;
}

int main(){
float i=1.002;
float j=1.000;
print(i,j);

return 0;
}

输出

 1.002
 1

我没有得到的是为什么cout删除了零,虽然我已经指定了 他们在宣传期间,我知道它不会有任何区别,但我只是好奇它为什么会发生。

4 个答案:

答案 0 :(得分:4)

  • 因为它的设计......?
  • 通常,我们不喜欢这个世界上无用的信息。
  • 因为1.000 == 1

答案 1 :(得分:4)

由于存储号码的方式。

IEEE浮点表示没有有效数字的概念。数字1.0或1.000在二进制表示法中看起来都相同。

打印时必须指定精度。

例如,Python的类型Decimal的行为与您想要的一样。

答案 2 :(得分:2)

期望您的代码打印这些尾随的零与仅仅因为您将变量初始化为float j = 5.0 - 4.0;而预期打印1.000没有什么不同。

从浮点表示的角度来看,没有“我在初始化期间指定了尾随零”这样的事情。浮点数不是字符串。他们是数字。并且有无限的不同方式来表示与程序文本中的一系列人类可读字符相同的数字。在程序的源代码中1.000.1e1相同,并且与cout相同 - 它们都代表相同的数字。

这意味着当需要将浮点数转换回SELECT ta.AttachmentId, ta.TaskId, ta.FileName, ta.FileLocation FROM TaskAttachments ta INNER JOIN Tasks t ON ta.TaskId = t.TaskId WHERE t.TaskType = 1; 的文本表示时,库将不知道(并且不关心)您最初使用的文本类型。您可以通过更改精度,宽度和其他格式细节(例如使用科学格式等)来影响文本输出,但是没有“输出它与我在源代码中编写它的方式相同”。

答案 3 :(得分:0)

为什么会打印1.000而不是1.0000000000000000?这两个数字在内存中都是相同的位。 (换句话说,浮点值以非常特定的格式存储为32位。无论是1.0还是-59.12391,它都是内存中的32位数据。)

如果您希望以某种方式打印,请使用格式说明符,例如setw()(不要忘记#include<iomanip>)以某种方式格式化cout输出。