我试图编写一个确定数字中小数位数的函数,但是在检查它是否有效时,发现数字精度存在问题。似乎R给数字增加了一些噪音。有办法阻止这种情况发生吗?
这是我使用的代码。我认为答案不时改变,所以我使用了set.seed()。
set.seed(100)
numberOfDecimals = function(y) {
n = 0
while (y %% 1 != 0) {
print(y %% 1)
y = y * 10
n = n + 1
}
return(n)
}
a = 12.1234789
numberOfDecimals(a)
这是我得到的结果:
[1] 0.1234789
[1] 0.234789
[1] 0.34789
[1] 0.4789
[1] 0.789
[1] 0.89
[1] 0.9
[1] 2.980232e-08
[1] 2.384186e-07
[1] 1.907349e-06
[1] 1.525879e-05
[1] 0.0002441406
[1] 0.001953125
[1] 0.015625
[1] 0.25
[1] 15
Warning message:
In numberOfDecimals(a) : probable complete loss of accuracy in modulus
这里15是最终答案(小数位数),在此之前的所有内容都来自print语句。我已经研究了警告消息,但是从我发现的结果来看,这通常是由R无法正确表示大数字引起的。对我来说,12.1234789似乎不是一个很大的数字,但我想我可能是错的。
我希望这样:
[1] 0.1234789
[1] 0.234789
[1] 0.34789
[1] 0.4789
[1] 0.789
[1] 0.89
[1] 0.9
[1] 7
对于我来说,直到0.9之后才显示随机数也没有意义。我尝试做以下事情以防万一
(0.9 * 10) %% 1
但是我得到的是0。
在此先感谢任何尝试提供帮助的人!
编辑:感谢每个人都指出这不是R问题,而是浮点问题。是否有任何原因导致直到最后一步才出现此问题?还是只是随机发生?