在 AutoHotkey 中对浮点数使用 Floor() 和 Ceil()

Using Floor() and Ceil() on floats in AutoHotkey

我在我的脚本中使用货币,需要合并便士四舍五入,但是 Floor() and Ceil() 函数将 down/up 舍入到最接近的整数,从而转储“.00”后缀。

示例:

  1. Ceil(3.14) = 4,当期望输出为3.15
  2. Floor(3.12) = 3,当期望输出为3.10

我该如何解决这个问题?

演示四舍五入到 1/100 的精度:

round( n, 2 )
floor( n*100 ) / 100
ceil( n*100 ) / 100

示例:

round( 3.1415, 2 )           ; returns 3.14
floor( 3.12   * 10  ) / 10   ; returns 3.100000
ceil(  3.1415 * 100 ) / 100  ; returns 3.150000

由于 round()floor()ceil() 只完成了一部分所需的功能,我写了一个小函数来完成适当的舍入。

pennyRound(val)
{
    ;Performs penny rounding on inputted float, and
    ;returns calculated amount.

    sub := SubStr(val, 0, 1)
    subMult := round((sub * 0.01), 2)

    if (subMult <= 0.02) {
        price := round((val - subMult), 2)
        return price
    }
    else if (subMult > 0.02 && subMult < 0.05) {
        price := round(round(val, 1) + 0.05, 2)
        ;price := round((val + subMult), 2)
        return price
    }
    else if (subMult > 0.05 && subMult < 0.07) {
        price := floor(val*10)/10
        price := round(price + 0.05, 2)
        return price
    }
    else if (subMult > 0.07) {

        price := ceil(val*10)/10
        price := round(price, 2)
        return price
    }
    else {
        return val
    }
}

您要找的似乎是四舍五入到最接近的 0.05 或 1/20。因此乘以 20 而不是 100。Ceiling、Floor 和 Round 函数就是

round(ceil(3.14*20)/20,2)   ; 3.15
round(floor(3.14*20)/20,2)  ; 3.10
round(round(3.14*20)/20,2)  ; 3.15

round(ceil(3.12*20)/20,2)   ; 3.15
round(floor(3.12*20)/20,2)  ; 3.10
round(round(3.12*20)/20,2)  ; 3.10