2008-11-06 45 views
6

此代碼:如何設置ostream的指數字段的寬度?

#include <iostream> 
int main(int, char **argv) 
{ 
std::cout << 1.23e45 << std::endl; 
} 

打印

1.23E + 045

當與MS Visual Studio 2003中編譯,並

1.23E + 45

在我的Linux機器上。

如何指定指數字段的寬度(以及爲什麼第一個地方存在差異)?

回答

1

我不認爲這是可能的標準操縱器。 (如果是的話,我希望被糾正,並學習如何)

你唯一剩下的選擇是自己創建一個streambuf,並攔截所有指向數據流的指數,手工重新格式化它們並將它們傳遞給到底層的流。

似乎很多工作,雖然不是火箭科學,但也不是微不足道的任務。

關於'爲什麼'的問題:我知道linux將指數定義爲最小兩位數,我想Windows將它指定爲最小三位?

// on linux 
std::cout << std::scientific << 1.23e4 << std::endl 

還增加了一個前導零:

1.230000e+04 
-1

調查iomanip標題。它具有很多寬度精度等功能。

+0

我需要哪一個?寬度是全寬度,精度是尾數的位數。 – 2008-11-06 13:26:35

1

正如@彼得的回答的後續,我一直在尋找運營商內部< <(ostream的&,雙)。事實上,沒有字段可以指定指數的顯着性或寬度。在窗口上,運營商< <轉發到sprintf,它也沒有指數大小。

接下來,sprintf函數(在Windows上)調用_cfltcvt_l,這是一個我們沒有源代碼的函數,但是它的簽名沒有提供指數精度。

我對Linux的實現一無所知。

相關問題