截断十进制数到最接近的4位小数并断言

时间:2017-09-07 13:55:46

标签: c++

如何用4个小数点舍入浮点数并在断言中使用它。我正在通过两种方法计算样本的平均值,并希望通过断言来比较它们。由于第6个小数点的平均值不同(可以),我得到一个断言错误。

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

我已经看到,大多数命令如std::precision用于输入输出操作。 std::numeric_limits的意义是什么?

我有一个解决方法,当我将浮点数乘以10000并将数字置于最低点时。这是有效的,但适当的解决方案会有所帮助。

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

1 个答案:

答案 0 :(得分:3)

您不能将float舍入为特定精度作为十进制数字量,因为浮点值内部为Σ(b i / 2 i )值 i float的1..24(当平台确实使用IEEE 754标准浮点实现时)。因此,例如1/1024 = 0.0009765625 =>你可能需要这个用cca调整第四个十进制数字。 + -9,但它也会在第四个之后添加更多的十进制数字。

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

在单元测试中,通常有专门的断言专用于浮动值比较,它具有进一步的参数 epsilon ,指定了容忍的最大值差异(在你的情况下,1e-4会这样做)。 p>

如果你没有使用一些广泛断言的单元测试框架,你可以使用Steve的建议(这是浮动断言的实现):

// 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