Asp classic ASP(vbscript)中的舍入错误

Asp classic ASP(vbscript)中的舍入错误,asp-classic,rounding-error,Asp Classic,Rounding Error,我对ASP或Vb脚本知之甚少。我正在尝试解决一个错误,在这个错误中,一个用经典ASP编写的过程意外地四舍五入到一个较小的奇数 按照我的理解,Round()应该是“从圆到平”。因为720*51/160=229.5, 圆形(720*51/160,0)应等于230。但是,ASP页面始终返回229 下面复制了实际的ASP代码。此实例中的变量如下所示: FreeElig = 51 RedcElig = 0 PaidElig = 109 TotMlsSrvAms = 720 MlsSrvAmsFr is r

我对ASP或Vb脚本知之甚少。我正在尝试解决一个错误,在这个错误中,一个用经典ASP编写的过程意外地四舍五入到一个较小的奇数

按照我的理解,Round()应该是“从圆到平”。因为720*51/160=229.5, 圆形(720*51/160,0)应等于230。但是,ASP页面始终返回229

下面复制了实际的ASP代码。此实例中的变量如下所示:

FreeElig = 51
RedcElig = 0
PaidElig = 109
TotMlsSrvAms = 720
MlsSrvAmsFr is returning the questionable value.
我感谢你能提供的任何帮助

多谢各位

Sub ClaimCalcs()

Dim tmpTtlEnroll, tmpFreeEnroll, tmpRedcEnroll, tmpPaidEnroll, tmpPct
Dim GreaterValue

tmpFreeEnroll = CLng(SetZero(FreeElig)) 
tmpRedcEnroll = CLng(SetZero(RedcElig)) 
tmpPaidEnroll = CLng(SetZero(PaidElig))

tmpTtlEnroll = tmpFreeEnroll + tmpRedcEnroll + tmpPaidEnroll

If tmpTtlEnroll > 0 Then 
    tmpPct = tmpFreeEnroll / tmpTtlEnroll
Else    
    tmpPct = 0
End If

MlsSrvAmsFr = Round(CLng(SetZero(TotMlsSrvAms)) * tmpPct, 0 )
你可以

MlsSrvAmsFr = Round((CLng(SetZero(TotMlsSrvAms)) * tmpPct) + 0.5, 0 
将0.5添加到代码中。我认为VBScript中没有内置的Ceil函数

我相信四舍五入会一直下降。因此,添加0.5将得到您想要的输出

0.1+0.5=0.6轮(0.6)=0

0.7+0.5=1.2轮(1.2)=1

MlsSrvAmsFr = Round((CLng(SetZero(TotMlsSrvAms)) * tmpPct) + 0.5, 0 
将0.5添加到代码中。我认为VBScript中没有内置的Ceil函数

我相信四舍五入会一直下降。因此,添加0.5将得到您想要的输出

0.1+0.5=0.6轮(0.6)=0


0.7+0.5=1.2轮(1.2)=1轮并不像您预期的那样有效。发件人:

Round函数执行从整数到偶数的操作,这与 从圆到大。返回值是最接近该值的数字 表达式,并具有适当的小数位数。如果 表达式正好介于两个可能的四舍五入值之间 函数返回可能的四舍五入值,其最右边的数字为 偶数。(在从四舍五入到更大的函数中,是 两个可能的四舍五入值之间的中间值始终四舍五入到 更大的数字。)


似乎舍入算法并不像示例中所暗示的那样清晰,这看起来像是另一个结果与预期略有不同的示例。

舍入的工作方式与您预期的不太一样。发件人:

Round函数执行从整数到偶数的操作,这与 从圆到大。返回值是最接近该值的数字 表达式,并具有适当的小数位数。如果 表达式正好介于两个可能的四舍五入值之间 函数返回可能的四舍五入值,其最右边的数字为 偶数。(在从四舍五入到更大的函数中,是 两个可能的四舍五入值之间的中间值始终四舍五入到 更大的数字。)

舍入算法似乎并不像示例中所暗示的那样清晰,这看起来像是另一个结果与预期略有不同的示例。

关于VBA中的Round()函数有这样的说法:

尽管舍入函数对于返回具有指定小数位数的数字很有用,但当舍入位数为5时,您无法始终预测它将如何舍入。VBA如何舍入一个数字取决于该数字的内部二进制表示形式

关于VBScript,它并没有说同样的事情,但我冒昧地猜测,同样的事情正在发生

底线是,如果您想要一个Round()函数,它的实际行为可以预测,那么您必须编写自己的函数/

(如果您想要一个执行“正常”舍入的函数,而不是一些花哨的“舍入到偶数”公式,请使用FormatNumber()。据我所知,该函数的行为实际上是可预测的,即x.5将始终舍入。)

关于VBA中的round()函数有这样的说法:

尽管舍入函数对于返回具有指定小数位数的数字很有用,但当舍入位数为5时,您无法始终预测它将如何舍入。VBA如何舍入一个数字取决于该数字的内部二进制表示形式

关于VBScript,它并没有说同样的事情,但我冒昧地猜测,同样的事情正在发生

底线是,如果您想要一个Round()函数,它的实际行为可以预测,那么您必须编写自己的函数/

(如果你想要一个进行“正常”舍入的函数,而不是一些花哨的“舍入到偶数”公式,请使用FormatNumber()。据我所知,这个函数的行为实际上是可预测的,即x.5总是舍入的。)

舍入是一件痛苦的事情,它是vbs

以下是我在互联网上发现的一些功能,这些功能多年来一直在帮助我

Function Floor(Number)
   Floor = Int(Number)
End Function

Function Ceil(Number)
    Ceil = Int(Number)
    If Ceil <> Number Then Ceil = Ceil + 1
End Function

Function Rounding(Number)
   Rounding = Floor(Number)
   If Number - Rounding >= .5 Then Rounding = Rounding + 1
End Function
功能楼层(编号)
楼层=整数(数字)
端函数
功能单元(编号)
Ceil=Int(数字)
如果Ceil编号,则Ceil=Ceil+1
端函数
函数舍入(数字)
四舍五入=楼层(数量)
如果数字-舍入>=.5,则舍入=舍入+1
端函数
轮是一种痛苦,它让vbs感到痛苦

以下是我在互联网上发现的一些功能,这些功能多年来一直在帮助我

Function Floor(Number)
   Floor = Int(Number)
End Function

Function Ceil(Number)
    Ceil = Int(Number)
    If Ceil <> Number Then Ceil = Ceil + 1
End Function

Function Rounding(Number)
   Rounding = Floor(Number)
   If Number - Rounding >= .5 Then Rounding = Rounding + 1
End Function
功能楼层(编号)
楼层=整数(数字)
端函数
功能单元(编号)
Ceil=Int(数字)
如果Ceil编号,则Ceil=Ceil+1
端函数
函数舍入(数字)
四舍五入=楼层(数量)
如果数字-舍入>=.5,则舍入=舍入+1
端函数

对不起;我没有很好地解释这个问题。我不想影响某个特定的输出。我想了解正在发生的输出。请看。正如它所说,在.5,round函数应该是“从圆到偶数”。在这种情况下,它是四舍五入到奇数。为什么?如果你明确地说(在第二个参数中)四舍五入到小数点后0位,也许这就是为什么它会变成229位?@Fendorio,请仔细阅读这个问题。如果小数点正好为0.5,则VBScript Round()应舍入到最接近的偶数整数。出于某种原因,它在229.5中出错了:最近的偶数整数是230,但函数返回229;我没有很好地解释这个问题。我不想影响某个特定的输出。我想了解正在发生的输出。请看。正如上面所说的,在0.5,rou