Round() Command missing?
Blitz3D Forums/Blitz3D Programming/Round() Command missing?
Am i blind? I cannot find any command that can round Floats to a special accuracy like:
float#=1.23523452
newfloat#=Round(float#,3)
newfloat# will now be 1.235
I know, i could write a function which will do the job - but i am not willing to always code-around missing basic commands. i think such a command is essential and should be integrated by mark. or am i wrong?
I can't think of a highly practical uses for it
You could always do:
num$="1.2345"
Print Left(num$,4)
this would print "1.23" on the screen
yeah but it does not round it up correctly. i have lots of practical uses for it (especially for my game).
Play with this:
Function Round#(Value#,Digits)
Local Newval#
if digits>1 then
newval#=int(value#*(10^(digits-1)))/(10^(digits-1))
else
newval#=int(value#)
endif
Return newval
End Function
[Edit]
Untested!
Function Round#(val#,precision)
val#=Floor#(val# * 10^precision)
val#=val/10^precision
return val#
end function
Same code using Int to round instead of truncate:
Function Round#(val#,precision)
If precision=0 Then
Return Int(val#)
Else
val#=Int(val# * 10^precision)
val#=val/10^precision
Return val#
End If
End Function
kevin, your code does not round correctly.
cygnus, thanks! (though you have a little typo in your code)
true, my code truncates at whatever precision you ask for.
@Cygnus: Noticed that too Val to value#
Still, think it'll work though
Hi, I agree this should be built in to blitz.
I'll add this to the code archives.
'Examples:
Local a:Float = 11.62552
Print "Rounding "+a
Print round(a,5) 'nearest mutiple of 5
Print round(a,2) 'nearest even number
Print round(a,1) 'nearest int
Print round(a,.1) 'one decimal place
Print round(a,.001) 'three decimal places
Function Round:Float(num:Float,precision:Float)
Return Int(num/precision+.5*Sgn(num))*precision
EndFunction
yeah, Val should have been Val#.
I typed it straight into the post window, as i said, it would need playing with :)
Kevin- your code is functionaly the same as mine, but does it work when you round to one place? (to me, one place means the INT value, two places is INT plus one of the following floats. You also need to use INT instead of FLOOR :) That should do what he wants.
[edit]
I updated the code.
it works from precision of 0 on upwards...truncates, though.
@Cygnus. Shouldn't it be..
Function Round#(value#,Digits)
Surely it would have to return a string? Floating point numbers aren't stored to x digits are they?
Hahaha! Yes thats right :) I fixed it, must not have posted the change!
Kevin, thats cool. Your code should be more efficient than mine then. I programmed my code to accept 1 to be the integer part and 2 to be after the floating point etc.
Still, you should use INT instead of FLOOR to get it to round correctly.
Floor and Ceil commands round up or down.
just a small alteration
this returns a value rounded to the number of decimal
places entered
Function Round#(Value#,Digits)
Local Newval#
If digits>1 Then
newval#=Int(value#*(10^(digits))+0.5)/(10^(digits))
Else
newval#=Int(value#)
EndIf
Return newval
End Function
This is the one I use, and after test, it seams to be the fastest way.
=> (*) is faster than (/)
and x*x is faster than x^n
so, it's optimised to run fast with lot of uses.
fl#=1.2345678901
For n=0 To 10
Print LIB_GET_Decimal(fl,n)
Next
WaitKey
End
Function LIB_GET_Decimal#(Var#,Dec%=0)
Local l_D#,l_f#
Select Dec
Case 0
l_D=1
l_f=1
Case 1
l_D=10
l_f=.1
Case 2
l_D=100
l_f=.01
Case 3
l_D=1000
l_f=.001
Case 4
l_D=10000
l_f=.0001
Case 5
l_D=100000
l_f=.00001
Case 6
l_D=1000000
l_f=.000001
Case 7
l_D=10000000
l_f=.0000001
Case 8
l_D=100000000
l_f=.00000001
Case 9
l_D=1000000000
l_f=.000000001
Default
Return Var
End Select
v2% = Var*l_D
Var = Float(v2)*l_f
Return Var
End Function
Remeber that Blitz3D don't remember more than 6 numbers after comma.