I modified a bit your macro:
int GetRightBin(TAxis *ax, Double_t x) {
int retVal = 1+int(ax->GetNbins()*(x-ax->GetXmin())/(ax->GetXmax()-ax->GetXmin()) + 0.5);
return retVal;
}
void TAxisBug (int nBins = 30, Double_t xMin=3.0, Double_t xMax=6.0)
{
//
// Test TAxis bug
//
TAxis *ax = new TAxis (nBins, xMin, xMax);
cout << "Root version : " << gROOT->GetVersion() << endl;
cout << "+----+------+--------+----++------+--------+----+" << endl;
cout << "| Id | Low | Center | Up || Low | Center | Up |" << endl;
cout << "+----+------+--------+----++------+--------+----+" << endl;
cout << "| | FindBin || GetRightBin |" << endl;
cout << "+----+------+--------+----++------+--------+----+" << endl;
for (int i=1;i<=8;i++) {
cout << "| " << i;
if (i == ax->FindBin (ax->GetBinLowEdge (i))) cout << " | " << ax->FindBin (ax->GetBinLowEdge (i));
else cout << " | \033[1;31m" << ax->FindBin (ax->GetBinLowEdge (i)) << "\033[0m";
if (i == ax->FindBin (ax->GetBinCenter (i))) cout << " | " << ax->FindBin (ax->GetBinCenter (i));
else cout << " | \033[1;31m" << ax->FindBin (ax->GetBinCenter (i)) << "\033[0m";
if (i == ax->FindBin (ax->GetBinUpEdge (i))) cout << " | " << ax->FindBin (ax->GetBinUpEdge (i));
else cout << " | \033[1;31m" << ax->FindBin (ax->GetBinUpEdge (i)) << "\033[0m";
if (i == GetRightBin(ax,ax->GetBinLowEdge (i))) cout << " || " << GetRightBin(ax,ax->GetBinLowEdge (i));
else cout << " || \033[1;31m" << GetRightBin(ax,ax->GetBinLowEdge (i)) << "\033[0m";
if (i == GetRightBin(ax,ax->GetBinCenter (i))) cout << " | " << GetRightBin(ax,ax->GetBinCenter (i));
else cout << " | \033[1;31m" << GetRightBin(ax,ax->GetBinCenter (i)) << "\033[0m";
if (i == GetRightBin(ax,ax->GetBinUpEdge (i))) cout << " | " << GetRightBin(ax,ax->GetBinUpEdge (i));
else cout << " | \033[1;31m" << GetRightBin(ax,ax->GetBinUpEdge (i)) << "\033[0m";
cout << " |" << endl;
}
cout << "+----+------+--------+----++------+--------+----+" << endl;
}
it gives:
As you can see your version (GetRightBin) has problem with the bin center.
