Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[.NET] Naar beneden afronden met x digits

Pagina: 1
Acties:

Verwijderd

Topicstarter
Tot mijn grote verbazing lijkt er in .NET geen standaard implementatie te zijn om naar beneden af te ronden met tot bepaalde nauwkeurigheid. Bijvoorbeeld 1,2345 afronden naar 1,234 en -1,2345 naar -1,235. Math.Round() doet alleen banker's rounding en away from zero, maar niet simpel naar beneden. Ik heb nu zelf een work-around bedacht in de vorm van een extension method voor Double, maar dit lijkt mij een erg omslachtige methode:

C#:
1
2
3
4
5
public static double RoundDown(this double value, int digits)
{
    double t = Math.Pow(10, digits);
    return Math.Floor(value * t) / t;
}

Iemand iets efficienters? Alleen al die Math.Pow die een floating point operatie doet, terwijl zowel digits als 10 altijd integers zijn, en er dus altijd een integer uitkomt.

Het wordt geïmplementeerd in een nogal rekenintensieve applicatie, vandaar dat ik het zo snel mogelijk wil doen.

[ Voor 10% gewijzigd door Verwijderd op 06-09-2008 02:32 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16-11 10:25

gorgi_19

Kruimeltjes zijn weer op :9

Je zou met Reflector eens verder kunnen onderzoeken wat Math.Floor doet. Uiteindelijk kom je bij
Visual Basic .NET:
1
2
<MethodImpl(MethodImplOptions.InternalCall)> _
Private Shared Sub FCallFloor(ByRef result As Decimal, ByVal d As Decimal)

uit; waarbij de tweede parameter wellicht openingen biedt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Hmm, daar kom ik niet bij. Ik kom niet verder dan de declaratie van Math.Floor() in mscorlib.dll. Daar staat Floor gedeclareerd als extern, en ik weet zo niet hoe ik de implementatie kan vinden.

Maar als ik het zo zie gebruikt Math.Floor() intern ook nog eens decimals wat het ook allemaal niet optimaal maakt...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:11
Er bestaat ook gewoon een overload vn Math.Floor die doubles gebruikt hoor ...
(en volgens mij hebben beide methods een andere implementatie):

Afbeeldingslocatie: http://users.pandora.be/fgzone/pics/doublefloor.PNG

Afbeeldingslocatie: http://users.pandora.be/fgzone/pics/decimalfloor.PNG

(Decimal.Floor gaat uiteindelijk FCallFloor( ref decimal result, decimal d ) aanroepen.

[ Voor 14% gewijzigd door whoami op 06-09-2008 18:37 ]

https://fgheysels.github.io/