具有小数约束的条件 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.00
或0.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
假设我有一个条件,如果数字以.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.00
或0.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