Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不能删除浮点数的尾随零_C++ - Fatal编程技术网

C++ 为什么不能删除浮点数的尾随零

C++ 为什么不能删除浮点数的尾随零,c++,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; } 我不明白的是,尽管我已经指定了,为什么不能删除零呢 在初始化过

所以我有这个密码

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.000==1

因为数字的存储方式

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

打印时必须指定精度


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

希望您的代码打印这些尾随的零与希望它打印
5.0-4.0
没有什么不同,因为您将变量初始化为
float j=5.0-4.0

从浮点表示的角度来看,不存在“我在初始化期间指定了尾随零”这样的情况。浮点数不是字符串。它们是数字。在你的程序文本中,有无数种不同的方式来表达同一个数字作为一系列人类可读的字符。在程序的源代码中,
1.000
1.00
相同,与
0.1e1
相同-它们都表示相同的数字


这意味着,当需要将浮点数转换回
cout
的文本表示形式时,库将不知道(也不关心)您最初使用的文本类型。您可以通过更改精度、宽度和其他格式细节(如使用科学格式等)来影响文本输出,但没有“以我在源代码中编写的方式输出”这样的事情。为什么它要打印
1.000
,而不是
1.0000000000000000
?这两个数字在内存中是完全相同的位。(换句话说,浮点值以非常特定的格式存储为32位。无论它是1.0还是-59.12391,它都是内存中某个位置的32位数据。)


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

,尽管我在“不,您没有”中指定了它们。在编译时,
1.000
1.0
1.00000000000000000
@rahul完全相同,您似乎对数据表示以及如何将其转换为人类可读文本有严重的误解。哈哈,不,不,我只是想知道是否有具体原因,看一下cout的输出,你不知道它是float、int还是double。我知道float、int、有符号数或无符号数是如何存储在内存中的,所以这就是你确定的原因?是的,在c++11标准中看到python和auto关键字后,我想到了这个问题。我明白了,但你能避免讽刺吗,我在问题中明确表示,这没有任何区别,我只是想知道文档中是否有关于这方面的内容
 1.002
 1