c++ - 将十进制数截断为最接近的 4 位小数并断言

标签 c++

如何将一个小数点后 4 位的 float 四舍五入并在 assert 中使用?我正在通过两种方法计算样本的平均值,并想通过断言来比较它们。由于小数点后 6 位的平均值不同(这没问题),我得到一个断言错误。

是否可以截断最后 2 个小数点或者只接受前 4 个小数点。

如我所见,std::precision 等大多数命令用于输入输出操作。 std::numeric_limits 的意义是什么?

我有一个解决方法,当我将 float 乘以 10000 并将该数字取底时。这行得通,但适当的解决方案会有所帮助。

float  mean, mean_x;
mean = 1.123456;
mean_x = 1.123499;
assert(std::floor(mean*10000) == std::floor(mean_x*10000));

最佳答案

您不能将 float 四舍五入到特定精度作为小数位数,因为在内部 float 值是 ∑ (bi/2i) i 的值对于 float 为 1..24(当平台确实使用 IEEE 754 标准浮点实现时)。因此,例如 1/1024 = 0.0009765625 => 您可能需要这个来通过 cca 调整小数点后第四位。 +-9,但它还会在第四位之后添加更多的小数位。

这就是为什么将 OUTPUT 格式化(四舍五入)为特定数量的十进制数字,但值保持不变。

在单元测试中,通常有专门用于浮点值比较的特殊断言,它有进一步的参数 epsilon,指定要容忍的最大值差异(在您的情况下 1e-4 就可以)。

如果你不使用一些具有广泛断言的单元测试框架,你可以使用史蒂夫的建议(这是这种 float 断言的实现):

// assert that the difference is smaller than 0.0001
assert(std::abs(mean - mean_x) < 1e-4);  // (abs from cmath) 

有关 float 工作原理的相关文档(在大多数平台上): What Every Programmer Should Know About Floating-Point Arithmetic

关于c++ - 将十进制数截断为最接近的 4 位小数并断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46098262/

相关文章:

c++ - 如何在 C++ 中获取集合中元素的引用?

c# - 应用程序启动器如何 self 更新?

c++ - 如何比较 LPCSTR

c++ - 默认参数与重载?

c++ - 是否有类似于 NUnit 的 C++ 单元测试库?

c++ - 如何在 C++ 中将空格和换行符分隔的整数读入二维数组?

c++ - 如何将 ocaml 代码编译为 native 以供 C++ 使用

c++ - 为什么 LLVM 中的 Expected<T> 为 Expected<T>&& 实现了两个构造函数?

c++ - 区分 C++ 中的多态类型

c++ - 用户定义类型上的空尖括号