首页 > 解决方案 > 使用“地板”时的数值精度

问题描述

编辑:有人将此问题标记为典型的“为什么0.1 + 0.3返回0.40000000001?”的重复,但请注意我不是在问为什么会发生这种情况;我完全清楚这一点。我只想知道在以下情况下是否有解决方法,当舍入不是一种选择时。


在编写以下函数时,应该返回给定某个noDigits整数的位数,nbase

#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转换)——似乎没有。

标签: c++precision

解决方案


推荐阅读