2016-10-02 1 views
1

Я читаю цены в долларах США из файла. ПримерЧтение фиксированных удвоений с фиксированной точкой из файла и конвертирование в длинный

asset_jsld 40.54 
asset_sxd 40.80 

Я хочу иметь map, который имеет эти цены в качестве ключа. Поскольку float или double меньше, чем идеалы, я конвертирую свои значения в долларовые центы, и я храню их как long. words - это список 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 и long является 4079. Получается ли эта ошибка округления от numeric_cast? Есть ли численная стабильная альтернатива?

+0

преобразование из '' double' в long' в направлении 0. Таким образом, чтобы иметь правильное округление в вашем случае, вы можете использовать 'непомерная цена = повышение :: numeric_cast (price_d * 100,0 + 0,5) 'округлить до почти ближайшего, при условии, что' price_d> = 0'. – Franck

ответ

2

Не выполняйте математические операции с номерами с плавающей запятой, если хотите согласованность. Прочитайте значения как строки, удалите точку и проанализируйте ее как long.

Is floating point math broken?

Смежные вопросы