【问题标题】:ASP Round function not behaving as expectedASP Round 函数未按预期运行
【发布时间】:2009-12-22 18:33:25
【问题描述】:

我正在将十进制值四舍五入为整数值 例如:

我有 5 个数字,它们的百分比总和最终应该是 100%,但我得到 101% 我的值是

11.11111, 80.55555, 5.55555, 2.77777 

四舍五入我得到

11, 81, 6, 3 => 101

在上面的例子中,5.555556 向上取整为 6(正确值),但是当我四舍五入并添加数字时,我的百分比总数超过了 100。 我如何强制或更改轮函数以提供所需的值? 我正在使用

round(100 * (x1/sum) )

我在网页上的输出是这样的:(我想显示 % 四舍五入到 int)

field value %
x      8    11
y      58   81

这不可能吗?

注意:我使用的是 asp round 函数 - 更新了

【问题讨论】:

    标签: .net asp.net asp-classic vbscript rounding


    【解决方案1】:

    在我看来,实际上 5.556 应该四舍五入到 6。也许你的学校教数学的方式不同?

    【讨论】:

    • 不,我知道它应该四舍五入到 6 :D 我的答案基于最终结果。我有 5 个数字,其百分比总和最终应为 100%,但我得到 101%,我的值是 11.11111、80.55555、5.55555、2.77777,四舍五入我得到 11、81、6、3 => 101
    • @Rahuls:您可以编写自己的舍入函数,使 0.5 下降而 0.6 上升。但这仍然会给你带来错误,你的总和可能是 99。你有什么理由需要在加法之前四舍五入吗?
    • 是的,我想要不带小数的值,这就是我对它们进行四舍五入的原因。我在表格中显示了数字及其百分比,最后是总数。
    【解决方案2】:

    也许你打错了,但 5.55556 实际上应该向上取整到 6(任何 0.5 及以上的取整,而低于 0.5 的取整向下取整)。如果您想要更好的控制,那么我会研究 floor 和 ciel 功能。 floor 总是向下取整, ciel 总是向上取整。

    【讨论】:

    • 我不认为经典的 ASP 有地板和天花板的功能,所以你必须编写自己的实现。
    • 看来你真正想做的是两件不同的事情。一 - 您希望对每个值进行四舍五入。二 - 您希望对所有值的总和进行四舍五入。我会将所有预先四舍五入的数字的总和四舍五入以获得您的总数。
    【解决方案3】:

    为什么你认为 5.55556 应该四舍五入到 5?舍入算法向上或向下舍入,具体取决于哪个整数最接近。显然 6 比 5 更接近 5.55556(它比 5.5 好),所以 6 是预期的正确答案。

    查看 floor 和 ceil 函数,分别了解始终向下舍入和始终向上舍入的替代实现。

    -奥辛

    【讨论】:

    • 除非函数以某种方式知道所涉及的所有数字,否则您是在问不可能的问题。
    • 所以,我知道这是一个老问题,但对于任何查找此问题的人来说,地板/天花板不是这里的问题。这是因为舍入本质上会引入误差范围。 Floor 会产生 98,Ceiling 会产生 102。根据重复的数字,我怀疑这些数字实际上是由 something/9 派生的,它创建了一个连续重复的数字。如果您有干净地终止小数(如 11.3+80.6+5.4+2.7 = 100),则四舍五入很好,但对于某些分数,您会收到此错误,因为您四舍五入一次以获得十进制值,然后再次舍入总数。跨度>
    【解决方案4】:

    您应该添加所有值,然后进行四舍五入。

    从本质上讲,四舍五入会让您多一点或少一点。因此,如果您添加的值都多一点,您将获得超过 100。

    【讨论】:

    • 是的,我知道我必须添加并进行四舍五入,但我的要求是我必须单独将它们四舍五入。圆形不是很好的解决方案吗?我应该以其他方式做吗
    • 在不知道确切的问题/要求的情况下,很难仅仅猜测解决方案
    【解决方案5】:

    VB(和 VBScript / ASP 3)使用银行家的四舍五入(或“四舍五入到最接近的偶数”)所以:

    1.5 rounds to 2
    2.5 rounds to 2
    3.5 rounds to 3
    4.5 rounds to 4
    ... etc.
    

    我建议按照 Jim Schubert 的建议进行操作,并编写自己的舍入函数以正确舍入。

    此页面有一些关于所有 vb 风格语言的四舍五入的好信息:

    http://support.microsoft.com/kb/196652

    【讨论】:

      【解决方案6】:

      如果您进行单独四舍五入,并且希望总数也为某个精确数字,则最后一个单独的数字必须始终是最终结果减去所有先前四舍五入的数字。

      这是 ASP 中的情况,也是 Excel f.i 中的情况。 AFAIK 这是实现这一目标的唯一方法。

      【讨论】:

        【解决方案7】:

        尝试做:

        round(100m * (x1/sum) )
        

        这应该强制将两个因素都视为小数而不是整数。另外,请确保 (x1/sum) 的分母中没有更大的数字。

        【讨论】:

          猜你喜欢
          • 2020-06-02
          • 2011-10-31
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多