c++ - 使用“地板”时的数值精度
问题描述
编辑:有人将此问题标记为典型的“为什么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
转换)——似乎没有。
解决方案
推荐阅读
- python - 有没有办法在 pyplot 中更改 .suptitle 的颜色?
- bash - Bash 查找具有特定扩展名的文件,但排除文件名中具有特定关键字的文件
- c - Prdct 是指向结构变量项地址的指针。为什么我们再次使用 & 运算符?已经是地址了
- python - 多处理池映射每个工作人员在 __main__ 块之外运行代码
- sql - 使用 SQL Hana 对数据进行分组
- algorithm - 为什么 Bron–Kerbosch 算法的这种实现不正确?
- python - 创建二维数组,使得行和列的总和等于给定的总和,并且在行和列中不重复相同的值
- jenkins-pipeline - 在 Jenkins 上运行时不允许 systrace 平台工具 Android SDK 操作
- javascript - 当两个输入都有值时如何向元素添加类
- c# - 为应用程序保留可写数据库的正确方法