我相信 R 错误地用小数秒格式化 POSIXct 类型。我通过 R-bugs 提交了这个作为增强请求,并被“我们认为当前的行为是正确的 - 已删除错误”拒之门外。虽然我非常感谢他们已经完成并继续做的工作,但我想听取其他人对这个特定问题的看法,也许就如何更有效地表达这一点提出建议。
这是一个例子:
> tt <- as.POSIXct('2011-10-11 07:49:36.3')
> strftime(tt,'%Y-%m-%d %H:%M:%OS1')
[1] "2011-10-11 07:49:36.2"
也就是说,tt 被创建为小数部分为 0.3 秒的 POSIXct 时间。当它以一位十进制数字打印时,显示的值为 0.2。我经常使用毫秒精度的时间戳,这让我很头疼,因为时间通常比实际值低一个档次。
这是正在发生的事情:POSIXct 是自纪元以来的浮点秒数。所有整数值都经过精确处理,但在以 2 为底的浮点数中,最接近 0.3 的值比 0.3 略小。strftime()
for 格式的规定行为%OSn
是向下舍入到请求的小数位数,因此显示的结果是 0.2。对于其他小数部分,浮点值略高于输入的值,并且显示给出了预期的结果:
> tt <- as.POSIXct('2011-10-11 07:49:36.4')
> strftime(tt,'%Y-%m-%d %H:%M:%OS1')
[1] "2011-10-11 07:49:36.4"
开发人员的论点是,对于时间类型,我们应该始终向下舍入到要求的精度。例如,如果时间是 11:59:59.8,那么用格式打印它%H:%M
应该给出“11:59”而不是“12:00”,并且%H:%M:%S
应该给出“11:59:59”而不是“12:00:00”。对于整数秒数和格式标志%S
,我同意这一点,但我认为对于为秒的小数部分设计的格式标志,行为应该有所不同。我希望看到%OSn
使用舍入到最近的行为,即使n = 0
同时%S
使用舍入,以便使用格式打印 11:59:59.8%H:%M:%OS0
会给出“12:00:00”。这不会影响整数秒的任何内容,因为它们总是精确表示,但它会更自然地处理小数秒的舍入错误。
这就是在例如 C 中处理小数部分打印的方式,因为整数转换向下舍入:
double x = 9.97;
printf("%d\n",(int) x); // 9
printf("%.0f\n",x); // 10
printf("%.1f\n",x); // 10.0
printf("%.2f\n",x); // 9.97
我对其他语言和环境中如何处理小数秒进行了快速调查,但似乎确实没有达成共识。大多数构造都是为整数秒而设计的,而小数部分是事后才想到的。在我看来,在这种情况下,R 开发人员做出的选择并非完全不合理,但实际上并不是最好的选择,并且与其他地方显示浮点数的约定不一致。
人们的想法是什么?R行为是否正确?是你自己设计的方式吗?