Solved

VB Significant Digits function

Posted on 2003-11-09
869 Views
Does anyone have a visual basic function that will return a passed number with a requested number of significant digits?
For example:
X = 1.233412
Y = FixSigFigs(X,3) 'I want Y to have 3 significant digits.

Function FixSigFigs( NumberToFix as double, SigFigs as Integer)

0
Question by:kar8942

LVL 48

Assisted Solution

AlexFM earned 83 total points
ID: 9709953
Round Function

Returns a number rounded to a specified number of decimal places.
Round(expression [,numdecimalplaces])

Dim MyVar, pi
pi = 3.14159
MyVar = Round(pi, 2) ' MyVar contains 3.14.

0

LVL 85

Assisted Solution

Mike Tomlinson earned 83 total points
ID: 9709955
Public Function FixSigFigs(NumberToFix As Double, SigFigs As Integer) As Double
Dim textNumber As String
Dim decimalPlace As Integer
Dim digitsToRight As Integer

FixSigFigs = NumberToFix ' If no change, return original number
textNumber = CStr(NumberToFix)
decimalPlace = InStr(textNumber, ".")
If decimalPlace > 0 Then
digitsToRight = Len(textNumber) - decimalPlace
If digitsToRight > SigFigs And SigFigs >= 0 Then
FixSigFigs = CDbl(Left(textNumber, decimalPlace + SigFigs))
End If
End If
End Function
0

LVL 85

Expert Comment

ID: 9710584
You didn't specify as to whether you wanted rounding or not.  Use the Round() function, as AlexFM suggested, if you need rounding to occur.  Otherwise, use my function if you simply want to truncate the number to the requested number of digits.
0

LVL 6

Accepted Solution

VK earned 84 total points
ID: 9714620
hello kar8942 !

That isn't a simple task in general.
Of course you can use the built in round function of vb.
But this function isn't country-independent.

Example:

? round(1.145,2)
1,14
? round(1.245,2)
1,25

In germany for example round(1.145,2) should be 1.15.
Therefore i wrote a user defined function:

Public Function RoundIt(Number As Variant, ByVal NumDigitsAfterDecimal As Long) As Variant
Select Case True
Case Not IsNumeric(Number)
RoundIt = Number
Case Else
NumDigitsAfterDecimal = 10 ^ NumDigitsAfterDecimal
RoundIt = Int(CDec(CDec(0.5) + CDec(Number) * CDec(NumDigitsAfterDecimal))) / CDec(NumDigitsAfterDecimal)
End Select
End Function

regards

V.K.
0

LVL 85

Expert Comment

ID: 9872472
What did you decide to use?
0

LVL 48

Expert Comment

ID: 10163002
kar8942 got two ways: rounding and truncating. He should decide what he need. Without his response I think points should be splitted.
0

Author Comment

ID: 10164264
Neither answer actually worked, but I will split the points anyway. Thanks.
0

Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question