核心R引擎在表达模数运算输出方面存在严重缺陷:
但是,如果您进行任何舍入或类似的数学运算,2.99的“不可见”剩余值会以意外的方式翻转事情。
虽然对于我当前的应用程序解决此问题很容易:
编辑:根据andrew.punnett的慷慨示例,
谢谢!
ceiling((1.99 %% 1) * 100)
返回结果为99(正确)。
ceiling((2.99 %% 1) * 100)
返回结果为100(不正确)。
该行为将在任何整数值N + 2.99(例如3.99等)中显露出来。如果这与浮点表示有关,则系统未表达差异的全部细节。这尤其令人不安,因为:
(1.99 %% 1)
和(2.99 %% 1)
均“看起来”返回0.99。
((1.99 %% 1) * 100)
和((2.99 %% 1) * 100)
均“看起来”返回99。但是,如果您进行任何舍入或类似的数学运算,2.99的“不可见”剩余值会以意外的方式翻转事情。
虽然对于我当前的应用程序解决此问题很容易:
floor((2.99 - floor(2.99)) * 100)
返回结果为99(正确)。
sprintf("%.22f", floor((2.99 - floor(2.99)) * 100))
返回结果为99.0000000000000000000000(正确)。
...但我想知道还有多少其他情况,模数返回错误值而没有底层细节显示浮点差异。是否有一种方式可以公开模数似乎附加的底层剩余值?否则它是不可见的。编辑:根据andrew.punnett的慷慨示例,
print(1.99, digits = 22)
返回1.99(无浮点扩展),而print(1.99 %% 1, digits = 22)
返回0.98999999999999999。根据Aaron的敏锐眼力,这似乎是版本和/或系统相关的。谢谢!
print(1.99, digits = 22)
,我得到了1.989999999999999991118
。 - Aaron left Stack Overflow