c++ - 使用 std::floor 的明显不一致

标签 c++ std floor

<分区>

我在使用 std::floor 时注意到一些非常奇怪的事情。我正在 ubuntu 上编译 C++。我正在尝试将 double 值降低到最接近的百分之一,并且正在检查输入值已经四舍五入到最接近的百分之一的情况,但我得到的结果不一致。

我的代码:

double hundredthFloor(double value){
  double hundredth = 0.01;
  return hundredth * std::floor( value / hundredth);
}

在大多数情况下它是有效的,

value = 99.87 gives output 99.87

value = 99.879 gives output 99.87

value = 0.39 gives output 0.39

但是:

value = 0.29 gives value 0.28

value = 0.47 gives value 0.46

我尝试了很多输入值,到目前为止,似乎只有 0.29 和 0.47 的输出值比我的预期低一位小数。

有人见过类似的东西吗?

最佳答案

您看到的原因是示例中的某些值,例如 0.010.29 , 无法使用 float 准确表示或 double .

如果您打印带有许多有效数字的结果,您可以更好地了解正在发生的事情:

cout << fixed << setprecision(15) << (value / hundredth) << endl;

value0.29 , 这个prints

28.999999999999996

这个数字非常接近 29,但是 floor无论如何都会将其截断为 28。

解决这个问题的一种方法是添加 epsilon到除法结果:

return hundredth * std::floor( value / hundredth + numeric_limits<double>::epsilon());

关于c++ - 使用 std::floor 的明显不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30485185/

相关文章:

c++ - 可以在分配有新位置的指针上调用 delete 吗?

c++ - 为什么这部分代码被忽略了?

c++ - 如何嵌入 YouTube 视频?

c++ - 根据类成员对同一键的多映射元素进行排序?

c++ - Visual 2015 上的 std::get_time 不会在不正确的日期失败

Ruby四舍五入向上或向下 float 到特定的十进制有效数字

java - 如何生成一定范围内的随机数

c++ - 如何从 main ( ) 调用线程成员函数

C++ 使用命名空间声明

haskell - 简单语句中的模糊类型 Haskell