dna*_*irl 4 floating-point r floating-accuracy
可能重复:
为什么这些数字不相等?
下面的表达式(评估为0.1)被认为大于0.1.
> round(1740/600,0) - 1740/600
[1] 0.1
> (round(1740/600,0) - 1740/600) <= 0.1
[1] FALSE //???!!???
> (round(1740/600,0) - 1740/600) <= 0.1000000000000000000000000000000000000001
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
认为问题可能是由于四舍五入,我尝试了同样的结果:
> 3 - 2.9
[1] 0.1
> (3 - 2.9) <=0.1
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
那么,给出了什么以及如何在不捏造截止值的情况下修复它?
42-*_*42- 14
有R函数可以自动采取合理的方法解决"平等问题":
> (3 - 2.9) <=0.1
#[1] FALSE
> all.equal( (3 - 2.9) , 0.1)
#[1] TRUE
Run Code Online (Sandbox Code Playgroud)
它使用R的最小正浮点数的sqrt作为其默认阈值,因此它处理乘法和除法传播的错误.结束于1e-08左右
Mic*_*rdt 11
从浮点指南:
为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而是我得到一个奇怪的结果,如0.30000000000000004?
因为在内部,计算机使用的格式(二进制浮点)无法准确地表示0.1,0.2或0.3之类的数字.
编译或解释代码时,"0.1"已经四舍五入到该格式中最接近的数字,即使在计算发生之前也会导致小的舍入误差.
我该怎么做才能避免这个问题?
这取决于你正在做什么样的计算.
- 如果你真的需要你的结果准确地加起来,特别是当你使用钱时:使用特殊的十进制数据类型.
- 如果您只是不想看到所有这些额外的小数位:只需将结果格式化为显示它时固定的小数位数.
- 如果您没有可用的十进制数据类型,则可以选择使用整数,例如完全以美分进行货币计算.但这是更多的工作,并有一些缺点.