2012-11-01 81 views
1

如何使用stringstream在雙數點後面打印小數位數(不包括尾隨零和舍入)?例如,如果我只想打印多達5位小數:使用流在點後打印最大小數位數

1 -> 1 
1.23 -> 1.23 
1.234 -> 1.234 
1.2345 -> 1.2345 
1.23456 -> 1.23456 
1.234567 -> 1.23456 
1.2345678 -> 1.23456 
1230.2345678 -> 1230.23456 <- Demonstrating that I am not talking about significant digits of the whole number either 

所有我看到的工具(運輸及工務局局長,setprecision,固定等),我不能似乎想出了這一個。謝謝!

+0

通常沒有這樣的事情。例如,當轉換爲二進制浮點時,'1.1'將以重複數字結尾。 *上面給出的大部分數字只能近似爲浮點數,代碼根本不可能猜測存儲的1.22999999997是否真的是你想要的,或者它是以1.23開始的。 –

+0

非常大或非常小的數字呢?像'1.0003e-15 == 10.003e-14'? – PiotrNycz

回答

1

你絕對想用stringstream選項來做到這一點嗎?

你可以這樣編寫一個round功能:

double round(double n, int digits) { 
    double mult = pow(10, digits); 
    return floor(n*mult)/mult; 
} 

,然後只打印round(1.2345678, 5)

0

沒有內置的方法來做到這一點(據我所知)。然而,類似下面的黑客將有可能:

void print_with_places(double num, unsigned places) { 
    for (double i = 1; i < num; i*=10) { //have to use a double here because of precision... 
     ++places; 
    } 
    std::cout << std::setprecision(places) << num; 
} 

這不是pretitest,但它是或將其打印到一個字符串,然後操作字符串。

相關問題