05-13-2022, 01:55 PM
(05-13-2022, 10:49 AM)SMcNeill Wrote:(05-13-2022, 01:08 AM)bplus Wrote:(05-13-2022, 12:45 AM)dcromley Wrote: > bplus: "Luke explained it as bankers rounding, so that not every 5 is rounded up but every other 5 is."
Yes, it is (now) clear that _ROUND rounds n.5 up if n is odd and down if n is even.
Int(n.5) always rounds n.5 up. SMcNeill's Round##(n.5,0) also always rounds up.
> aural: "Round() function always round to lower value"
Wha--?
I'm sure just a mis-word but INT() always rounds down for positives anyway.
BTW that's another crazy issue to worry about, rounding with negatives. I'm not sure you always want to add .5 in SMcNeill's Round##()
If not,then add * SGN(num) after that 0.5. Tweak the behavior to whatever suits your personal needs/desires.
I tried that last night it was a mess!
Today I try removing neg sign, doing the calc and then putting the sign back in, interesting it fails or does bankers rounding! Not what I expected.
Code: (Select All)
Print "N", "Round", "Round Sgn", "Round Neg"
For n## = -1 To 1.00000001 Step .01
Print n##, RoundOrig(n##, 1), RoundSgn(n##, 1), RoundNeg(n##, 1)
i = i + 1
If i Mod 20 = 0 Then Print "zzz... ": Sleep: Cls: Print "N", "Round", "Round Sgn", "Round Neg"
Next
Function RoundOrig## (num As _Float, toDecPlace As _Unsigned _Byte)
RoundOrig## = Int(num * 10 ^ toDecPlace + .5) / 10 ^ toDecPlace
End Function
Function RoundSgn## (num As _Float, toDecPlace As _Unsigned _Byte)
RoundSgn## = Int(num * 10 ^ toDecPlace + .5 * Sgn(num)) / 10 ^ toDecPlace
End Function
Function RoundNeg## (num As _Float, toDecPlace As _Unsigned _Byte)
If num < 0 Then cnum = -1 * num: nFlag = -1 Else cnum = num: nFlag = 1
RoundNeg## = nFlag * Int(cnum * 10 ^ toDecPlace + .5) / 10 ^ toDecPlace
End Function
b = b + ...