Avrunda en flottör till ett vanligt rutnät med fördefinierade punkter

Avrunda en flottör till ett vanligt rutnät med fördefinierade punkter

Så länge ditt rutnät är regelbundet, hitta bara en transformation från heltal till detta rutnät. Så låt oss säga att ditt rutnät är

0.2  0.4  0.6  ...

Sedan går du förbi

float round(float f)
{
    return floor(f * 5 + 0.5) / 5;
    // return std::round(f * 5) / 5; // C++11
}

Standarden ceil() , floor() funktioner har ingen precision, jag antar att man skulle kunna komma runt det genom att lägga till din egen precision - men detta kan leda till fel - t.ex.

double ceil(double v, int p)
{
  v *= pow(10, p);
  v = ceil(v);
  v /= pow(10, p);
}

Jag antar att du kan testa för att se om detta är tillförlitligt för dig?


En algoritm du kan använda:

  • få 10-to-the-power(antal-signifikanta-siffror) (=P10)
  • multiplicera ditt dubbelvärde med P10
  • lägg till:0,5 (eller subtrahera om det är negativt - se Ankush Shahs kommentar)
  • dela heltalsdelen av denna summa med (P10) - svaret blir ditt avrundade tal