首页 > 解决方案 > 在 C++ 中将 double 舍入到小数点后两位,但结果与预期不符

问题描述

我想计算给定价格的下限(2.65 * 0.9)

  2.65 * (1 - 0.1) = 2.385

然后将其四舍五入到小数点后 2 位,结果 2.385 -> 2.39

  round(2.385) = 2.39

但是当我使用 C++ 实现上述功能时:

double pclose = 2.65;
double range = 0.1;
double lmtdown = pclose * (1 - range);
double lmtdownAfterRound= std::round( lmtdown * 100 ) / 100;

printf("pclose=%.2f, range=%.2f, limit down before round=%f,\n", pclose, range, lmtdown);
printf("limit after round=%f\n", lmtdownAfterRound);

但打印的结果是 2.38 !!!!!!而不是我想要的 2.39

pclose=2.65, range=0.10, limit down before round=2.385000,
limit after round=2.380000

我用 std::floor 尝试了另一种圆形方法:

lmtdownAfterRound= std::floor(lmtdown * 100 + 0.5) / 100;
printf("limit after round =%f\n", lmtdownAfterRound);

结果仍然是 2.38:

limit after round with floor=2.380000

我的 c++ 代码有问题吗,如何获得正确的舍入值?

标签: c++

解决方案


使用std::ceil/std::floor

工作代码

// Example program
// Example program
#include <iostream>
#include <cmath>
int main() {
double pclose = 2.65;
double range = 0.1;
double lmtdown = pclose * (1.0 - range);
int left = int(lmtdown *1000) %10;

double lmtdownAfterRound;
if (left >=5)
lmtdownAfterRound=std::ceil( lmtdown *100.  )/100.;
else
lmtdownAfterRound=std::floor( lmtdown *100.  )/100.;

printf("pclose=%.2lf, range=%.2lf, limit down before round=%lf,\n", pclose, range, lmtdown);
printf("limit after round=%lf\n", lmtdownAfterRound);
}

输出:

pclose=2.65, range=0.10, limit down before round=2.385000,
limit after round=2.390000

在这里测试它:http: //cppshell.com/


推荐阅读