具有小数约束的条件 If 语句

Conditional If statements with decimal constraints

假设我有一个条件,如果数字以.00 结尾,则向其添加 2,如果数字以.99 结尾,则向其添加 3。因此,如果我有 5.00 和 5.99,我想编写一个嵌套的 if 语句,允许我根据其结尾将正确的值添加到原始数字。

如何在 R(或 python)中做到这一点?

python.

def func(num):
    if round(num, 2) - int(num) < 0.001:
        return num + 2
    elif round(num, 2) - int(num) > 0.989:
        return num + 3 
    return num

您可以将数字四舍五入到小数点后两位,减去它的整数部分,然后四舍五入结果以检查它是否接近0.000.99.简单地检查四舍五入前的结果是 0.00 还是 0.99 是不可靠的,因为 floating point numbers

您的 list/vector 中似乎还有其他值需要处理。我给一个矢量化的格式:

在 R 中:

data = c(5.00,5.99,5.61)
mm = function(x){
  x = round(x,2)
  y = x-as.integer(x)
  ifelse(round(y-0.00,2)==0, x+2,ifelse(round(y-0.99,2)==0,x+3,x))
} 

mm(data)
[1] 7.00 8.99 5.61

在 Python 中:numpy module

的矢量化格式
import numpy as np
x = np.array([5.00,5.99,5.61])
def mm(x):
    x = np.round(x,2)
    y = x - np.array(x,dtype = 'i')
    return np.where(np.round(y-0.00,2)==0, x+2,np.where(np.round(y-0.99,2)==0,x+3,x))

mm(x)
array([7.  , 8.99, 5.61])

R我们可以做到

v1 + (floor(v1) != v1) + 2
#[1] 7.00 8.99

如果我们要查找最后两个数字元素

v2 <- sub(".*(.{2})$", "\1", sprintf('%0.2f', v1))
ifelse(v2 == "00", v1 + 2, ifelse(v2 == "99", v1 + 3, v1))
#[1] 7.00 8.99

数据

v1 <- c(5, 5.99)

由于 floating point precision,您需要将数字四舍五入到小数点后两位,因为 5.99 等值无法准确表示。这意味着 5.9921875 之类的值必须满足您的标准,因为 最终为 0.99

如果您不介意,请使用 Python's Format Specification Mini-Language 将隐式舍入并允许提取所需的小数。

def get_decimals(num, n=2):
    return '{0:.2f}'.format(num)[-2:]

def func(num):
    decs = get_decimals(num)

    if decs == '00':
        return num + 2
    elif decs == '99':
        return num + 3
    else: return num