Я работал над простым кодом для создания гистограмм и нашел следующий код:
double value = 1.2;
double bucketSize = 0.4;
double bucketId = value / bucketSize;
std::cout << "bucketId as double: " << bucketId << std::endl;
std::cout << "bucketId as int: " << int(bucketId) << std::endl;
приводит к сумасшедшему выводу:
bucketId as double: 3
bucketId as int: 2
что в основном разрушает мое доверие к компьютерам ;) при поиске правильного bucketId
для value
при создании гистограммы.
Я знаю, что есть ошибки округления и т. д., но есть ли какое-нибудь общее решение этой проблемы?
(На всякий случай) Пожалуйста, не предлагайте добавлять 0.5
к результату деления перед приведением к int
, поскольку, по-видимому, в некоторых случаях это не очень хорошо работает (например, double value = 3; double bucketSize = 2;
)
Заранее спасибо.
std::round()
не поможет. - person Moomin   schedule 21.10.20140.5
может привести к неявным ошибкам, см. мой ответ здесь для примера ближе к середине. - person Shafik Yaghmour   schedule 21.10.2014