Я читаю цены в долларах США из файла. ПримерЧтение фиксированных удвоений с фиксированной точкой из файла и конвертирование в длинный
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
? Есть ли численная стабильная альтернатива?
преобразование из '' double' в long' в направлении 0. Таким образом, чтобы иметь правильное округление в вашем случае, вы можете использовать 'непомерная цена = повышение :: numeric_cast (price_d * 100,0 + 0,5) 'округлить до почти ближайшего, при условии, что' price_d> = 0'. –
Franck