Здравствуйте, anatoly1, Вы писали:
A>Это баг или фича?
Это норма.
0.1 в double на самом деле представлено как 0.10000000000000001.
Переменная b при инициализации получает значение 0.1000000000000000055511151231257827021181583404541015625
А сумма b2 1.000000000000000055511151231257827021181583404541015625
При сравнении (b2==1) b2 не приводится к int, а наоборот.
Если написать (static_cast<int>(b2) == 1), то результат будет true.
Ну или можно сделать так:
boost_decimal b2(1);
boost_decimal b3(10);
auto b4(b2 / b3); // честный 0.1
::std::cout << ::std::setprecision(80) << b4 << ::std::endl;
auto s2(b4+b4+b4+b4+b4+b4+b4+b4+b4+b4);
::std::cout << "sum2 " << ::std::setprecision(80) << s2 << ::std::endl;
assert(s2==1);
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.