"numeric"类型和"integer"的区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"numeric"类型和"integer"的区别?相关的知识,希望对你有一定的参考价值。

参考技术A integer是整数,numeric浮点数,你运行一下as.integer(1.23)和as.numeric(1.23)就知道区别了

为啥 `ceiling` 和 `floor` 的默认返回类型是数字?

【中文标题】为啥 `ceiling` 和 `floor` 的默认返回类型是数字?【英文标题】:Why is the default return type of `ceiling` and `floor` numeric?为什么 `ceiling` 和 `floor` 的默认返回类型是数字? 【发布时间】:2015-11-13 07:10:12 【问题描述】:

为什么下面都是"numeric"

class(ceiling(3))
class(ceiling(3L))
class(ceiling(3.1))
class(floor(2))
class(floor(2L))
class(floor(2.1))

这似乎是一种算术运算,其结果是明确的整数(不像 exponentiation),而与输入无关(传递复数是错误的)。

我尝试在底层C 代码中寻找相关的答案,但并没有真正得到任何结果。

我还了解到,虽然 "%/%"(x,y) 也应该始终是整数,但结果的 class 取决于输入类型,例如5%/%26%/%26%/%2L 都是numeric,但5L%/%2L6L%/%2L 都是integer(这方面的内容在?Arithmetic 中有提及);这对我来说也没有什么意义,但至少它是有记录的。

ceilingfloor 返回numeric 对象有简单的原因吗?如果是因为重铸导致效率低下(这似乎是整数除法的情况),我希望class(ceiling(3L))"integer",那么这是怎么回事?

【问题讨论】:

完全随机猜测 - 也许有人希望能够做到 ceiling(Inf) 而不会得到 NA @digEmAll 这只是事后的理由——谁在乎他为什么或如何到达那里。关键是想要按照他的建议去做并没有本质上的错误,而且整数上的ceiling 应该返回浮点数也没有内在的原因。 @eddi:当然没有错,但是如果你开始向天花板/地板添加一个重载只是为了取一个整数并返回自己(如果它不是无用的话......),你'将完成创建所有类型的无用函数,只是因为一个人不关心他如何得到一个整数列表和浮点数......好吧,如果你不关心那个,你为什么关心这个列表返回所有的上限数字而不是整数和数字? @digEmAll 查看 joran 在下面 eddi 的回答中发布的链接。似乎有一个完全合理的地方需要我得到的灵活性。 @eddi:我基本上同意你的说法,但是,除了我关于这些功能的实用性的观点之外,我认为决定不实施这些变体背后还有一个技术原因。 AFAIK S3 通用函数不适用于atomic 类型(整数、数字、逻辑等);所以你不能使用通用调度系统,但你需要在默认实现中使用某种 if 语句来检查是整数还是双精度。这会在必须尽可能快的函数内添加条件跳转(=性能损失)(想象一下,如果您使用它数百万次......) 【参考方案1】:

我不知道这是否就是ceiling 被设计为返回numeric 的原因,但以下示例显示了ceiling 在实际返回整数时的限制:

options(digits = 15)
.Machine$integer.max + 1.4
#[1] 2147483648.4

ceiling(.Machine$integer.max + 1.4)
#[1] 2147483649

as.integer(ceiling(.Machine$integer.max + 1.4))
#[1] NA
#Warning message:
#NAs introduced by coercion 

也就是说,我没有充分的理由理解为什么ceiling 在给定整数输入时不返回整数。

【讨论】:

有点切线相关的是this。 @MichaelChirico:关于 joran 的链接,是的,seq 返回的类型似乎有点混乱……例如,seq(1L,length.out=6L) 返回数字,而 seq(1L,by=1L,length.out=6L) 返回整数……据说,也许这个特殊问题可以通过添加ceiling 的重载来解决(当然也可以通过其他方式......),但我的观点是整数上的上限/下限大多是无用的(从某种意义上说,你可以获得不做任何事情也一样)而且我不认为 R 开发人员有兴趣添加不必要的功能...... 关于ceiling(double)返回双精度的原因,我同意eddi认为整数大小限制可能是原因... 嗯,这只是抓住稻草 - 我认为丢失信息是一个更重要的问题;顺便说一句,我刚刚在谷歌上搜索了这个问题 - 显然它基本上出现在你能想到的每一种语言中,答案在任何地方都是一样的(以上) @MichaelChirico 我很确定整数和实数在 fortran 中具有相同的大小 - 如果是这种情况,那么返回整数将非常有意义

以上是关于"numeric"类型和"integer"的区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何定制Numeric属性/字段验证消息

弱类型整数大小比较绕过

<TextInput keyboardType="numeric"/> 在本机反应中不起作用

SyntaxError:identifier starts immediately after numeric literal

JS数组排序,有些位置不懂,帮忙注释哈。为啥从小到大排序?

golang中string类型的数组字典如何提取?