gpt4 book ai didi

c++ - modf 返回 1 作为小数 :

转载 作者:行者123 更新时间:2023-11-30 00:59:42 24 4
gpt4 key购买 nike

我有这个静态方法,它接收一个 double 并“剪切”它的小数尾部,在点后留下两位数字。 几乎一直工作。我注意到当它接收到 2.3,然后将其变为 2.29。 0.3、1.3、3.3、4.3 和 102.3 不会发生这种情况。代码基本上将数字乘以 100 使用 modf 将整数值除以 100 并返回它。这里的代码捕获了这个特定的数字并打印出来:

static double dRound(double number) {

bool c = false;
if (number == 2.3)
c = true;


int factor = pow(10, 2);
number *= factor;


if (c) {
cout << " number *= factor : " << number << endl;
//number = 230;// When this is not marked as comment the code works well.
}


double returnVal;
if (c){
cout << " fractional : " << modf(number, &returnVal) << endl;
cout << " integer : " <<returnVal << endl;
}


modf(number, &returnVal);
return returnVal / factor;
}

它打印出:

数字 *= 因子:230

小数:1

整数:229

有谁知道为什么会这样,我该如何解决?谢谢,祝周末愉快。

最佳答案

记住 float 不能精确表示十进制数。 2.3 * 100 实际上给出 229.99999999999997。因此 modf 返回 229 和 0.9999999999999716。

但是,cout 的格式默认只会显示小数点后 6 位的 float 。所以 0.9999999999999716 显示为 1。


您可以(大致)使用浮点值表示的误差上限来避免 2.3 错误:

#include <cmath>
#include <limits>
static double dRound(double d) {
double inf = copysign(std::numeric_limits<double>::infinity(), d);
double theNumberAfter = nextafter(d, inf);
double epsilon = theNumberAfter - d;

int factor = 100;
d *= factor;
epsilon *= factor/2;
d += epsilon;

double returnVal;
modf(number, &returnVal);
return returnVal / factor;
}

结果:http://www.ideone.com/ywmua

关于c++ - modf 返回 1 作为小数 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3884232/

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