簡體   English   中英

為什么 cout 刪除浮點數的尾隨零

[英]why does cout remove the trailing zeroes for floating point numbers

所以我有這個代碼

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 刪除零,盡管我在初始化過程中指定了它們,我知道它不會有任何區別,但我只是好奇它為什么會發生。

  • 因為它是設計使...?
  • 通常,我們不喜歡這個世界上無用的信息。
  • 因為1.000 == 1

因為號碼的存儲方式。

IEEE浮點表示沒有有效數字的概念。 數字 1.0 或 1.000 在二進制表示法中看起來都一樣。

您必須在打印時指定精度。

例如,Python 會執行一個Decimal類型,它的行為與您想要的一樣。

期望您的代碼打印那些尾隨零與期望它打印5.0 - 4.0沒有什么不同,因為您將變量初始化為float j = 5.0 - 4.0; .

從浮點表示的角度來看,沒有“我在初始化期間指定了尾隨零”這樣的事情。 浮點數不是字符串。 他們是數字。 並且有無數種不同的方式可以將相同的數字表示為程序文本中一系列人類可讀的字符。 在程序的源代碼中, 1.0001.000.1e1相同 - 它們都代表相同的數字。

這意味着當需要將浮點數轉換回cout的文本表示時,庫將不知道(也不會關心)您最初使用的文本類型。 您可以通過更改精度、寬度和其他格式詳細信息(如使用科學格式等)來影響文本輸出,但沒有“按照我在源代碼中編寫的方式輸出”這樣的東西。

為什么會打印1.000而不是1.0000000000000000 這兩個數字在內存中是完全相同的位。 (換句話說,浮點值以非常特定的格式存儲為 32 位。無論是 1.0 還是 -59.12391,它都是內存中某處的 32 位數據。)

如果您希望以某種方式打印它,請使用諸如setw() (不要忘記#include<iomanip> )之類的格式說明符以某種方式格式化您的cout輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM