gpt4 book ai didi

c++ - 像 MS Excel 那样在 C++ 中舍入 double 值

转载 作者:太空狗 更新时间:2023-10-29 20:46:12 25 4
gpt4 key购买 nike

我在网上搜索过,但找不到解决我问题的方法。我只是想要一个像 MS Excel 那样四舍五入 double 值的函数。这是我的代码:

#include <iostream>
#include "math.h"

using namespace std;

double Round(double value, int precision) {
return floor(((value * pow(10.0, precision)) + 0.5)) / pow(10.0, precision);
}

int main(int argc, char *argv[]) {
/* The way MS Excel does it:
1.27815 1.27840 -> 1.27828
1.27813 1.27840 -> 1.27827
1.27819 1.27843 -> 1.27831
1.27999 1.28024 -> 1.28012
1.27839 1.27866 -> 1.27853
*/
cout << Round((1.27815 + 1.27840)/2, 5) << "\n"; // *
cout << Round((1.27813 + 1.27840)/2, 5) << "\n";
cout << Round((1.27819 + 1.27843)/2, 5) << "\n";
cout << Round((1.27999 + 1.28024)/2, 5) << "\n"; // *
cout << Round((1.27839 + 1.27866)/2, 5) << "\n"; // *

if(Round((1.27815 + 1.27840)/2, 5) == 1.27828) {
cout << "Hurray...\n";
}
system("PAUSE");
return EXIT_SUCCESS;
}

我在 stackoverflow 上找到了这个函数,答案表明它的工作方式类似于内置的 excel 舍入例程,但事实并非如此。你能告诉我我错过了什么吗?

最佳答案

从某种意义上说,您所要求的是不可能的:

大多数常见平台上的浮点值没有“小数位数”的概念。像 2.3 或 8.71 这样的数字根本无法精确表示。因此,要求任何函数返回具有给定非零小数位数的浮点值是没有意义的——这样的数字根本不存在

对于浮点类型,您唯一可以做的就是计算最接近的可表示近似值,然后以所需的精度打印结果,这将为您提供所需数字的文本形式。要计算表示,您可以这样做:

double round(double x, int n)
{
int e;
double d;

std::frexp(x, &e);

if (e >= 0) return x; // number is an integer, nothing to do

double const f = std::pow(10.0, n);
std::modf(x * f, &d); // d == integral part of 10^n * x

return d / f;
}

(您也可以使用 modf 而不是 frexp 来确定 x 是否已经是一个整数。您还应该检查 n 是非负的,或者以其他方式定义负“精度”的语义。)


除了使用 float 点类型,您还可以执行固定 点运算。也就是说,您将所有内容都存储为整数,但将它们视为单位,例如 1/1000。然后你可以打印这样一个数字如下:

 std::cout << n / 1000 << "." << n % 1000;

加法按预期工作,但您必须编写自己的乘法函数。

关于c++ - 像 MS Excel 那样在 C++ 中舍入 double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8758156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com