编辑:有人将此问题标记为典型的“为什么0.1 + 0.3
返回0.40000000001
?”的重复项,但请注意我不是在问为什么 发生这种情况;我完全意识到这一点。我只是想知道在无法舍入的情况下,是否存在以下情况的解决方法。
编写下面的noDigits
函数时,应该在给定某个n
的情况下返回整数base
的位数,
#include <math.h>
using namespace std;
int noDigits(int n, int base = 10) {
return (n != 0) ? int(floor(log(abs(n)) / log(base)) + 1) : 1;
}
我遇到了以下精度问题:如果我打印出log(abs(1000))/log(10)
,我会得到3
,但是当我将floor
应用于它(即floor(log(abs(1000))/log(10))
)时,我会得到2
。
我猜想这是由于log(abs(1000))/log(10)
被存储为2.9999999[...]
之类的东西,但是我不确定如何解决它。在某些情况下,log(abs(n))/log(base)
实际上类似于2.9987456[...]
,因此舍入到一定精度是不可行的。
我该如何克服?
澄清:虽然有许多简单的替代方法可以解决此特定问题,但我想问是否存在使用floor
(或int
转换)的一般解决方法-似乎没有。