具有十进制约束的条件If语句

时间:2018-08-10 15:59:17

标签: python r if-statement nested-if

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

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

4 个答案:

答案 0 :(得分:1)

由于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

答案 1 :(得分:0)

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。由于floating point numbers,仅检查舍入前的结果是0.00还是0.99是不可靠的。

答案 2 :(得分:0)

似乎您的列表/向量中还有其他值需要处理。我将给出矢量化格式:

在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])

答案 3 :(得分:0)

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)