Freigeben über


Ganze Zahlen werden falsch gerundet, wenn Produktkonfigurationsmodelle berechnet werden

Problembeschreibung

Dieses Problem kann auftreten, wenn Sie die folgende Reihe von Aktionen ausführen:

  1. Richten Sie diese Attribute für ein Produktionskonfigurationsmodell ein:

    • Eingabe (ganze Zahl)
    • Prozent (Dezimalzahl)
    • Ergebnis (ganze Zahl)
  2. Erstellen Sie eine Berechnung mit dem folgenden Ausdruck:

    Ergebniseingabe = × Prozent ÷ 100

In diesem Fall wird das ganzzahlige Ergebnis nicht immer richtig gerundet. Wenn die Eingabe beispielsweise 1.000 ist und der Prozentsatz 2,40 ist, erwarten Sie, dass das ganzzahlige Ergebnis 24 ist, da 2,40 Prozent von 1.000 24 (oder 24,00 in Dezimalform) betragen. Stattdessen wird das Ergebnis als 23 angezeigt. Wenn der Prozentsatz jedoch 2,39 beträgt, wird die Berechnung auf 24 statt auf 23 gerundet. Wenn der Prozentsatz 2,50 ist, wird die Berechnung wie erwartet auf 25 gerundet.

Ursache

Dieses Problem tritt auf, da Microsoft Solver Foundation intern Zahlen mithilfe von Bruchzahlen darstellt. Im vorherigen Beispiel wird das Ergebnis der Berechnung, bei der der Prozentsatz 2,40 ist, als 27021597764222975 ÷ 1125899906842624 = 23,9999999999999999999991118215802998747676610946652734375 dargestellt. Wenn .NET diesen Wert als ganze Zahl umgibt, wird 23 zurückgegeben.

Lösung

Dieses Verhalten wird nicht geändert, da andere Szenarien davon abhängen. Im vorherigen Beispiel können Sie das Problem beheben, indem Sie ein zusätzliches Dezimal-Attribut und berechnungen einführen.

Richten Sie beispielsweise die folgenden Attribute für ein Produktionskonfigurationsmodell ein:

  • Eingabe (ganze Zahl)
  • Prozent (Dezimalzahl)
  • ResultDecimal (Dezimalzahl)
  • ResultInteger (ganze Zahl)

Anschließend können Sie die folgenden Berechnungen hinzufügen:

  • ResultDecimal = Input × Percent ÷ 100
  • ResultInteger = ResultDecimal