c++ - 在 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++ 代码有问题吗,如何获得正确的舍入值?
解决方案
使用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/
推荐阅读
- python - 如何使用装饰器获取类泛型类型的运行时类型?
- ios - 应用程序因文件 Swift/ContiguousArrayBuffer.swift Xcode 12、iOS 14、SwiftUI 而崩溃
- r - 使用命令“R CMD BATCH ou.txt”在 MATLAB 中调用 R
- reactjs - 在 reactjs 中将数据添加到本地存储
- android - 带有片段错误的数据绑定找不到 BindingImpl 类
- python-3.x - Traceroute IP 与 python3.8 和多处理
- javascript - 在 Vue 组件中导入和使用外部 Typescript 模块
- c++ - 在矩阵 C++ 中找到最小距离
- rust - &[u8] 不能被 RangeFull 索引?
- android - 当触摸区域包含 RecyclerView 时,Android MotionLayout OnSwipe 不起作用