2016-10-02 68 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?