2014-03-12 109 views
0

如果你爲一些做C++如何避免尾隨零?

double number; 
cout.precision(3) 
cout<<number; 

像1.23456你得到1.234但如果人數是1.2,你得到1.200。如何獲得1.234和1.2(他們是無用的零)?假設你不知道你要打印什麼號碼。

+0

我不認爲這是你應該「避免」。如果我們談論精度,那麼1.200中的零不是「無用的」。這聽起來像你想要一個舍入函數,而不是一個精確函數。 –

+1

也許我錯過了一些東西,但[**這不*做你想要的**](https://ideone.com/GgsVCh)?你使用的是什麼版本的C++(並且工具鏈信息也會被讚賞)? – WhozCraig

+0

是的,我想要一個舍入函數,但也要截斷 – user3290180

回答

4
#include <iostream> 
#include <iomanip> 
using namespace std; 

auto main() -> int 
{ 
    cout << setprecision(4); 
    cout << 1.23456 << endl;  // -> "1.235" 
    cout << 1.2 << endl;   // -> "1.2" 
} 

就是這麼簡單:這就是你默認得到的。


C++ 03缺乏的操縱器,用於復位設定fixedscientific或後爲默認格式。然而,在C++ 11中引入了機械手。您可以使用它像這樣:

#include <iostream>  // defaultfloat 
#include <iomanip>  // setprecision 
using namespace std; 

#ifdef __GNUC__ // Also check for version number, e.g. 4.8.2 and earlier 
    namespace std { 
     inline 
     auto defaultfloat(ios_base& stream) 
      -> ios_base& 
     { stream.unsetf(ios_base::floatfield); return stream; } 
    } 
#endif 

auto main() -> int 
{ 
    cout << "Lots of digits: " << fixed << setprecision(16) << 1.2 << endl; 
    cout << endl; 

    cout << "Deault presentation:" << endl; 
    cout << defaultfloat; 
    cout << 1.234 << endl; 
    cout << 1.2 << endl; 
} 
+3

你的例子是缺少他發送到標準輸出的特定數據:1.23456應該被剪裁(雖然我認爲他沒有意識到它會導致1.235,但除此之外),而1.2應該簡單地「成爲」。 – WhozCraig

+1

你是認真的嗎?我只是舉了一些例子,然後我說你不知道你打算打印哪個數字,因爲它們是變量。 它的變量值是1.23456你不能這樣做,因爲你沒有得到1.234 – user3290180

+0

當你把他的示例輸入「1.23456」並改變時,我看不到這是「默認情況下得到的結果」它的目的是爲了你的答案「1.234」。 –

0

你可能會寫一個機械手,實現您的格式:

#include <cmath> 
#include <iostream> 

template <typename T> 
struct DecimalPrecision 
{ 
    const T& value; 
    const unsigned decimals; 

    DecimalPrecision(const T& value, unsigned decimals) 
    : value(value), decimals(decimals) 
    {} 

    void write(std::ostream& stream) const { 
     std::ios_base::fmtflags flags = stream.flags(); 
     stream.unsetf(std::ios_base::floatfield); 
     std::streamsize restore 
      = stream.precision(std::ceil(std::log10(std::abs(value))) + decimals); 
     stream << value; 
     stream.precision(restore); 
     stream.flags(flags); 
    } 
}; 

template <typename T> 
inline DecimalPrecision<T> decimal_precision(const T& value, unsigned decimals) { 
    return DecimalPrecision<T>(value, decimals); 
} 

template <typename T> 
inline std::ostream& operator << (std::ostream& stream, const DecimalPrecision<T>& value) { 
    value.write(stream); 
    return stream; 
} 


#include <iomanip> 

int main() 
{ 
    std::cout << std::setprecision(2); 
    double values[] = { 12345.6789, 1.23456789, 1.2 }; 
    for(unsigned i = 0; i < sizeof(values)/sizeof(values[0]); ++i) 
     std::cout 
      << i << ": " << values[i] << '\n' 
       << " " << decimal_precision(values[i], 2) << '\n'; 
}