1

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

据我了解, Round() 应该“四舍五入”。由于 720 * 51 / 160 = 229.5,Round(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 )
4

4 回答 4

2

你可以做

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

于 2013-11-12T21:04:54.153 回答
2

MSDN对 VBA 中的 Round() 函数有这样的说法:

尽管 Round 函数对于返回具有指定小数位数的数字很有用,但您不能总是预测当舍入数字为 5 时它将如何舍入。VBA 如何舍入数字取决于该数字的内部二进制表示。

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

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

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

于 2013-11-12T22:44:21.663 回答
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
于 2013-11-13T04:36:59.193 回答
0

Round 不像你所期望的那样工作。来自MSDN

Round 函数执行round to even,这与round to large 不同。返回值是最接近表达式值的数字,带有适当的小数位数。如果表达式正好在两个可能的舍入值之间,则函数返回最右边数字为偶数的可能舍入值。(在舍入到更大的函数中,一个介于两个可能舍入值之间的数字总是四舍五入到较大的数字。)

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

于 2013-11-12T22:24:42.320 回答