我希望能够完成与 Microsoft Excel 的 ROUNDUP 和 ROUNDDOWN 功能相同的功能。现在我正在使用以下内容:
roundup_val = ROUND(val + 0.005,2)
由于将 0.005 添加到该值,因此会将 正值四舍五入到小数点后第二位。但是,如果该值只有 2 位小数或剩下 2 位小数,则此方法无法正常工作。例如,Excel 对值 val = 20.01 的 ROUNDUP 到小数点后两位,将返回相同的值 ROUNDUP(20.01,2) = 20.01。我上面的方法将返回 ROUND(20.015,2) = 20.02,这是不正确的。
我认为,如果我包含更多代码来检查数字是否少于三位小数,然后它会简单地保留相同的数字,因为它已经四舍五入到第二位,那么这种方法将会起作用。如果我要这样做,我还想知道如何检查一个数字有多少位小数。
也有可能此方法不是完成 FoxPro 版本 ROUNDUP 的最佳方法。还有其他适用于所有数字的想法吗?
谢谢!
你是对的,VFP 没有 RoundUp() 和 RoundDown() 函数。但它们很容易创建。我的后院已经有了这个:
*ROUNDUP.PRG
Lparameters tnValue, tnPlaces
Local lnResult, lnValue
lnValue = Abs(m.tnValue)
If Round(m.lnValue, m.tnPlaces) != m.lnValue
lnValue = Round(m.lnValue+((10^-(m.tnPlaces+1))*5), m.tnPlaces)
EndIf
Return Sign(m.tnValue) * m.lnValue
*ROUNDDOWN.PRG
Lparameters tnValue, tnPlaces
Local lnResult, lnValue
lnValue = Abs(m.tnValue)
If Round(m.lnValue, m.tnPlaces) != m.lnValue
lnValue = Round(m.lnValue-((10^-(m.tnPlaces+1))*5), m.tnPlaces)
EndIf
Return Sign(m.tnValue) * m.lnValue
只需将它们另存为 roundup.prg 和 rounddown.prg,您就可以拥有与 Excel 一样的 ROUNDUP()、ROUNDDOWN() 函数。
您还可以使用
CEILING
和 FLOOR
功能:
CEILING
是大于或等于该数字的下一个整数。FLOOR
是小于或等于该数字的下一个整数。? CEILING(3.14159) && 4
? FLOOR(3.14159) && 3
? CEILING(-17.385) && -17
? FLOOR(-17.385) && -18