Ich habe mal auf meiner Platte nachgesehen, die Rundungsfehler sind bekannt und wurden nur teilweise behoben.
Es macht auch einen Unterschied, ob die Werte aus einer Variablen oder einem Feld stammen. Hier eine Funktion von Andreas Gehr Pals
Code: Alles auswählen
Function RoundX(nValue, nDecimals, nPrecission)
LOCAL nInitial
if empty(nPrecission)
nInitial := nDecimals + 1
else
nInitial := nPrecission
endif
return (Round(Round(nValue, nInitial), nDecimals))
// And here is a sample program to show you how and why this works: Andreas Gehr Pals ...
Procedure Main()
LOCAL nValue := 0.3 * 1.65
set alternate to Round_RX.TXT additive
set alternate on
?
? "Round_RX() on Xbase++ ", version()
? "nValue (0.3 * 1.65) ", nValue
? " 0.3 * 1.65 ==>", str( nValue , 22, 20)
? "Round (0.3 * 1.65, 2) ==>", str( Round(nValue, 2) , 22, 20)
? "RoundX(0.3 * 1.65, 2) ==>", str(RoundX(nValue, 2) , 22, 20)
? "RoundX(0.3 * 1.65, 2, 2) ==>", str(RoundX(nValue, 2, 2), 22, 20)
? "RoundX(0.3 * 1.65, 2, 3) ==>", str(RoundX(nValue, 2, 3), 22, 20)
? "RoundX(0.3 * 1.65, 2, 4) ==>", str(RoundX(nValue, 2, 4), 22, 20)
? "RoundX(0.3 * 1.65, 2, 8) ==>", str(RoundX(nValue, 2, 8), 22, 20)
?
return
Ergebnis:
Code: Alles auswählen
Round_RX() on Xbase++ Xbase++ (R) Version 2.00
nValue (0.3 * 1.65) 0,495 // das ist nur die Anzeige !
0.3 * 1.65 ==> 0.49499999999999990000 // das ist der interne Wert
Round (0.3 * 1.65, 2) ==> 0.49000000000000000000
RoundX(0.3 * 1.65, 2) ==> 0.50000000000000000000
RoundX(0.3 * 1.65, 2, 2) ==> 0.49000000000000000000
RoundX(0.3 * 1.65, 2, 3) ==> 0.50000000000000000000
RoundX(0.3 * 1.65, 2, 4) ==> 0.50000000000000000000
RoundX(0.3 * 1.65, 2, 8) ==> 0.50000000000000000000
Ich habe eigene Abwandlungen, aber alle machen das Gleiche, zuerst auf die zu bewertende Nachkommastelle runden, dann auf 2.