2016-10-02 50 views
1

我正在從文件讀取美元價格。示例從文件中讀取固定點的固定點並轉換爲長

asset_jsld 40.54 
asset_sxd 40.80 

我想有一個map這些價格作爲關鍵。由於floatdouble不是理想的鍵,我將我的價值轉換爲美分,我將它們存儲爲longwords是原始文件列中的string的列表。

using boost::spirit::qi::parse; 
// ... 
if (!parse(words[1].begin(), words[4].end(), double_, price_d)) 
    // Error handeling 
long price = boost::numeric_cast<long>(price_d * 100.0); 

的問題是,double是40.80和long4079。這個舍入錯誤來自numeric_cast嗎?有數字穩定的替代方案嗎?

+0

轉換成'long'是對0,所以有你的情況正確的舍入,您可以用'長期價格=提振:: numeric_cast (price_d * 100.0 + 0.5)如果'price_d> = 0',則舍入到幾乎最接近的值。 – Franck

回答

2

如果要保持一致性,請不要對浮點數進行數學運算。以字符串形式讀取值,刪除點並將其解析爲long。從`double`

Is floating point math broken?