FoxPro如何完成相当于Excel的ROUNDUP和ROUNDDOWN

问题描述 投票:0回答:2

我希望能够完成与 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 的最佳方法。还有其他适用于所有数字的想法吗?

谢谢!

sql visual-foxpro foxpro
2个回答
2
投票

你是对的,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() 函数。


0
投票

您还可以使用

CEILING
FLOOR
功能:

  • 数字的
    CEILING
    是大于或等于该数字的下一个整数。
  • 数字的
    FLOOR
    是小于或等于该数字的下一个整数。
? CEILING(3.14159)  && 4
? FLOOR(3.14159)    && 3
? CEILING(-17.385)  && -17
? FLOOR(-17.385)    && -18

摘自:https://hackfox.github.io/section4/s4g050.html

© www.soinside.com 2019 - 2024. All rights reserved.