为什么这个VBA函数不正确的四舍五入?

下面是我在Excel中创build的VBA函数,用于将脚的测量值从数字转换为文本。 例如,函数将采用数字1.5并将其转换为string:1'-6“。

不过由于某种原因,错误地将11.5英寸的值四舍五入。 当一个单元格被设置为'= 11.5 / 12'(11.5英寸以英尺表示)时,结果是3个重复的0.9583。 当我把这个值传递给我的txtfeet()函数时,它返回string1'-0“,真正的答案应该是string11 1/2”。

该function适用​​于其他重复数字,如9.5英寸(0.7916与6重复)。 奇怪的是,如果我通过1英尺和11.5英寸(换句话说,3个重复的1.9583),它也可以正常工作。

谁能帮助解决这个错误?

这是我的function的代码。

Public Function txtfeet(FeetIn As Double, Optional Denominator As Integer = 8) ' This function will change a decimal number of feet (FeetIn) to the text string ' representation of feet, inches, and fractional inches. ' ' It will round the fractional inches to the nearest 1/x where x is the denominator ' and is given by the user as the second argument of this function. If a denominator ' is not given, it defaults to 8 as shown above. ' ' Modified from MrExcel.com ' set a variable to the integer portion of FeetIn NbrFeet = Fix(FeetIn) ' set a variable to the number of inches in decimal form InchIn = (FeetIn - NbrFeet) * 12 ' set a variable to the integer portion of InchIn NbrInches = Fix(InchIn) ' set a variable to the remaining fractional inches in decimal form FracIn = (InchIn - NbrInches) * Denominator ' set a variable to be FracIn rounded to the nearest whole number Numerator = Application.WorksheetFunction.Round(FracIn, 0) ' if the fractional inches are zero, define the portion of text ' that will represent the fractional inches to be blank If Numerator = 0 Then FracText = "" ' otherwise, if the number of inches plus the fractional inches rounds up to ' 12, add one to NbrFeet and set NbrInches to zero and FracText to blank ElseIf (InchIn + (Numerator / Denominator)) = 12 Then NbrFeet = NbrFeet + 1 NbrInches = 0 FracText = "" ' otherwise, if the numerator equals the denominator, add one to NbrInches ' and set FracText to blank ElseIf Numerator = Denominator Then NbrInches = NbrInches + 1 FracText = "" ' otherwise, define FracText in its simplest fractional form Else ' use a loop to get the fractional inches to their simplest form Do ' if the numerator is even, divide both numerator and divisor by 2 If Numerator = Application.WorksheetFunction.Even(Numerator) Then Numerator = Numerator / 2 Denominator = Denominator / 2 Else FracText = " " & Numerator & "/" & Denominator Exit Do End If Loop End If ' define the output of the function as a text string of feet, inches, and ' fractional inches or just inches and fractional inches if NbrFeet is zero ' or just fractional inches if both NbrFeet and NbrInches are zero If NbrFeet = 0 And NbrInches = 0 And Numerator = 0 Then txtfeet = "0""" ElseIf NbrFeet = 0 And NbrInches = 0 Then txtfeet = Application.WorksheetFunction.Trim(FracText) & """" ElseIf NbrFeet = 0 Then txtfeet = NbrInches & FracText & """" Else txtfeet = NbrFeet & "'-" & NbrInches & FracText & """" End If End Function 

我相信你的路线

 ElseIf (InchIn + (Numerator / Denominator)) = 12 Then NbrFeet = NbrFeet + 1 NbrInches = 0 FracText = "" 

应该

 ElseIf (NbrInches + (Numerator / Denominator)) = 12 Then NbrFeet = NbrFeet + 1 NbrInches = 0 FracText = "