【问题标题】:F# round up to a specific number of decimal placesF# 向上舍入到特定的小数位数
【发布时间】:2013-04-07 03:00:11
【问题描述】:

例如,我可以使用System.Math.Round((float),2)将浮点数四舍五入到最接近的小数点后 2 位,但无论如何在 F# 中我可以四舍五入我的浮点数2位小数? 谢谢

【问题讨论】:

    标签: f# rounding roundup


    【解决方案1】:

    四舍五入的黑客解决方案

    let round x d =
        let rounded = Math.Round(x,d)
        if rounded < x then x + Math.Pow(10,-d) else rounded
    

    【讨论】:

    • 呃,一个 if 分支只是为了四舍五入?添加一半所需的精度,然后四舍五入,当然!
    • 我正在尝试Math.Round x 3,但它抛出了一个错误。 IDK 为什么!但是这个解决方案解决了我的问题。
    【解决方案2】:

    向上取整(严格向上,而不是从零开始):

    let roundUp x d = 
        Math.Round(x + Math.pow(10,-d)/2,d)
    

    考虑将 0.001 舍入为 2dp。您希望将其四舍五入为 0.01:

    0.001 + 0.01/2 = 0.006
    -> 2dp: 0.01
    

    这源自从截断获得正常舍入的常用方法;增加一半所需的精度并截断。然而,这会受到负数的影响,因此需要根据原始值的符号减去或添加增量。

    请注意,如果您总是四舍五入,则负数会向零舍入。在通常需要 2dp 的财务情况下,这是一个坏主意,因为 0.021 的余额四舍五入为 0.03,但 -0.021 的余额四舍五入为 -0.02,并且计算借方还是贷方开始变得重要.如果你对称地做,例如总是远离零,那么你就不再关心了。

    【讨论】:

    • 比这更糟糕 - 在默认的 RoundToEven 行为下,一些已经是整数的数字不稳定。例如,roundUp 1.05 2 将产生 1.06。您需要在 Round 中使用 MidPointRounding.AwayFromZero 并确保始终舍入负数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多